NHibernate未映射具有ComposeId的继承属性
在我看来,这是一个bug,但在我将其提交给NHibernate bugtracker之前,我想确认我对该如何工作的理解 我的项目配置为使用显式模型映射,并在每次运行时恢复数据库。我有一个定义属性的简单基类。子类希望将该属性与其自己的属性组合,以生成复合主键,如下所示:NHibernate未映射具有ComposeId的继承属性,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,在我看来,这是一个bug,但在我将其提交给NHibernate bugtracker之前,我想确认我对该如何工作的理解 我的项目配置为使用显式模型映射,并在每次运行时恢复数据库。我有一个定义属性的简单基类。子类希望将该属性与其自己的属性组合,以生成复合主键,如下所示: public class BaseClass { public int InheritedId { get; set; } } public class Subclass : BaseClass { public
public class BaseClass
{
public int InheritedId { get; set; }
}
public class Subclass : BaseClass
{
public int OwnId { get; set; }
}
public class SubclassMap : ClassMapping<Subclass>
{
public SubclassMap()
{
Table("Subclass");
ComposedId(x => {
x.Property(p => p.InheritedId);
x.Property(p => p.OwnId);
});
}
}
公共类基类
{
public int inheriteId{get;set;}
}
公共类子类:基类
{
public int OwnId{get;set;}
}
公共类子类映射:类映射
{
公共子类映射()
{
表(“子类”);
复合ID(x=>{
x、 属性(p=>p.inheritedd);
x、 属性(p=>p.OwnId);
});
}
}
预期结果
我的数据库中有一个名为Subclass的表,其中有两列:InheriteId和OwnId,主键由这两列组成
实际结果
数据库中名为Subclass的表,其中有两列:InheriteId和OwnId,主键仅由OwnId组成
权变措施
如果我将属性复制到子类(将其标记为new
),上述操作就可以了
假设
从NHibernate源代码来看,TypeExtensions.DecodeMemberAccessExpression()
方法返回InheritedId的MemberInfo,该InheritedId将基类指定为其ReflectedType,而稍后当声明的模型最终解析时,typeof(Subclass).GetProperties()
返回将子类指定为反射类型的MemberInfo。两者是不同的,因此ModelMapper.MapRootClass()
无法在要映射的composedId中找到它,而之前编译过它
救命啊!
你遇到过这个问题吗?我是在做一些奇怪的事情,还是应该作为不正确的行为提交给NHibernate bugtracker?我想你已经发现了一个合法的bug 生成的映射应为:
<class name="Subclass" table="Subclass">
<composite-id>
<key-property name="OwnId" />
<key-property name="InheritedId" />
</composite-id>
</class>
但事实是:
<class name="Subclass" table="Subclass">
<composite-id>
<key-property name="OwnId" />
</composite-id>
<property name="InheritedId" />
</class>
你可以在Jira中打开该问题
另外,如果您有时间,您可以在Github中插入它,修复它(不破坏任何测试)并提交请求。我认为您已经找到了一个合法的bug 生成的映射应为:
<class name="Subclass" table="Subclass">
<composite-id>
<key-property name="OwnId" />
<key-property name="InheritedId" />
</composite-id>
</class>
但事实是:
<class name="Subclass" table="Subclass">
<composite-id>
<key-property name="OwnId" />
</composite-id>
<property name="InheritedId" />
</class>
你可以在Jira中打开该问题
另外,如果您有时间,您可以在Github中完成它,修复它(不破坏任何测试)并提交拉取请求。谢谢您的确认。我会四处看看,看看是否能找到原因,以及这是一个简单的修复还是太复杂,我无法用有限的NHibernate架构知识来处理。进一步挖掘后,似乎不一定是一个bug。NHibernate更愿意在单独的映射中将属性从超类映射到单独的表。现在我想看看我是否可以在Loquacious中强制每个具体类使用table,以及它是否会产生允许我在子类中映射
InheritedId
的预期结果。谢谢您的确认。我会四处看看,看看是否能找到原因,以及这是一个简单的修复还是太复杂,我无法用有限的NHibernate架构知识来处理。进一步挖掘后,似乎不一定是一个bug。NHibernate更愿意在单独的映射中将属性从超类映射到单独的表。现在,我想看看我是否可以在Loquacious中强制每个具体类使用table,以及它是否会产生允许我在子类中映射InheritedId
的预期结果。