我有一个非常可扩展的模块化应用程序。我想从其他程序集扩展映射的实体。但是,我仍然需要对基类进行操作。
例:
程序集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的某些代码中创建人员时,NHibernate便将其保存为Employee。每当我保存一个Person并尝试在程序集A中刷新它时,都会由于代理而导致类强制转换异常。程序集A不得依赖程序集B。
我需要在程序集A的所有方法中对父类进行操作。子类仅在其他程序集中使用。
我该如何映射这样的东西?如何告诉NHibernate将其另存为父类?我使用SaveOrUpdate持久化实体;如何正确扩展实体并将其保存到同一表中而没有区分符? NHibernate不能按对象类型区分吗?有解决方法吗?
我不想指定手动代理,因为我必须为每个实体创建一个代理!由于依赖性问题,我无法使用访客模式。
我需要一种方法来在其他程序集中扩展映射的实体而不会出现此类问题!该数据库是旧版,我无法更改。您将如何解决该问题?
最佳答案
将层次结构映射到单个表而没有区分符的目标提出了一个难题。数据层中必须有某些东西,这可以为DAL提供线索,即特定记录是Employee而不是Person。由于您没有在“人员”表上为雇员映射任何其他字段,也没有提供鉴别符,因此“人”表的任何单个记录都没有任何区别人和衍生出更多雇员的记录。
您能否提供用于检索个人记录的代码?以我的经验,NHibernate查询实际上总是需要一个域类型才能合并。在这种情况下,NHibernate可能试图创建其知道的最大派生类型的对象,并且由于它无法区分基本Person和更多派生的Employee之间的区别,因此所有Person都是Employees。您可以尝试使用Linq,它可以强制进行强类型的对象水化,而不是HQL或其他不太强引用的查询。
关于c# - NHibernate映射:将层次结构保存到单个表而没有区分符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4470724/