c# - NHibernate 映射 : Save hierarchy to single table without discriminator

标签 c# .net nhibernate orm

我有一个非常可扩展和模块化的应用程序。我想从其他程序集中扩展映射的实体。然而,我仍然需要对基类进行操作。

例子:

程序集 A 中的父类映射:

    public class PersonMap : ClassMap<Person> 
    {
        public PersonMap()
        {
            Table("Persons");

            Id(x => x.Id).GeneratedBy.Assigned();
        }
}

程序集 B 中的子类映射:

public class EmployeeMap : SubclassMap<Employee>
{
    public EmployeeMap()
    {
        Table("Persons");
        Extends(typeof(Person));

        KeyColumn("Id");

        LazyLoad();

        HasMany<Assignments>(x => x.Assignments).KeyColumn("Id").Inverse().Cascade.AllDeleteOrphan().LazyLoad().NotFound.Ignore();
    }
}

现在,每当我在程序集 A 的某些代码中创建一个 Person 时,它就会被 NHibernate 保存为 Employee。每当我保存一个 Person 并尝试在程序集 A 中刷新它时,由于代理而导致类转换异常。程序集 A 不能依赖于程序集 B。

我需要在程序集A的所有方法中对父类进行操作,子类只在其他程序集中使用。

我怎样才能映射这样的东西?我怎样才能告诉 NHibernate 将它保存为父类?我使用 SaveOrUpdate 来保存实体;我怎样才能正确地扩展实体并将它们保存到同一个表中而没有鉴别器? NHibernate 不能区分对象类型吗?有解决方法吗?

我不想指定手动代理,因为我必须为每个实体创建一个代理!由于依赖性问题,我无法使用访问者模式。

我需要一种方法来在不同的程序集中扩展映射实体而不会出现此类问题!数据库是遗留的,我无法更改它。您将如何解决这个问题?

最佳答案

您的目标是在没有鉴别器的情况下将层次结构映射到单个表,这是一个难题。数据层中必须有一些东西可以为 DAL 提供一条线索,即特定记录是一个员工,而不仅仅是一个人。由于您没有在 Persons 表上为 Employee 映射任何其他字段,也没有提供鉴别器,因此 Persons 表的任何单个记录都无法将 Persons 与更多派生的 Employees 区分开来。

您能否提供用于检索人员记录的代码?以我的经验,NHibernate 查询实际上总是需要一个域类型来进行组合。可能是在这种情况下,NHibernate 试图创建它知道的最派生类型的对象,并且因为它无法区分基本 Person 和更派生的 Employee 之间的区别,所以所有 Person 都是 Employees。您可以尝试 Linq,它强制强类型对象水合,而不是 HQL 或其他不太强引用的查询。

关于c# - NHibernate 映射 : Save hierarchy to single table without discriminator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470724/

相关文章:

javascript - 无法在 MVC 中捆绑 jQuery 文件

.net - 使用 Rijndael 或 AES 加密对值进行加盐是一种基本的良好做法吗?

NHibernate、事务和 TransactionScope

c# - 如何使用 DISTINCT 在 NHibernate SQL 查询中进行分页

c# - 是否有实现异步游戏引擎循环的最佳实践?

c# - FluentNHibernate 使用额外数据映射连接表

c# - Windows 应用程序 : Best Practices & Patterns (C#/WPF/LINQ)

C#变量初始化问题

c# - 如何正确并行化严重依赖 I/O 的作业

c# - 将 blob (.bacpac) 转换为 .bacpac 文件以将数据库导入到 SQL Server Azure?