在我看来,这是一个错误,但是在我将其提交给NHibernate bugtracker之前,想要确认我对它应该如何工作的理解。
我的项目配置为使用显式模型映射,并在每次运行时恢复数据库。我有一个定义属性的简单基类。子类希望将该属性与其自身组合以生成复合主键,如下所示:
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);
});
}
}
我的数据库中名为 Subclass 的表,其中包含两列: InheritedId 和 OwnId ,以及由这两列组成的主键
数据库中名为 Subclass 的表,其中包含两列: InheritedId 和 OwnId ,以及由组成的主键只是 OwnId 。
如果我将属性复制到 Subclass (将其标记为new
),则上述工作正常。
从NHibernate源看来,TypeExtensions.DecodeMemberAccessExpression()
方法似乎为 InheritedId 返回 MemberInfo ,指定 BaseClass 作为其 ReflectedType ,稍后当最终解析声明的模型时,typeof(Subclass).GetProperties()
返回 MemberInfo ,指定 Subclass 作为反射类型。这两者是不同的,因此ModelMapper.MapRootClass()
无法在 ComposedIds 中找到它,以便在之前编译它的映射。
你遇到过这个问题吗?我做了一些奇怪的事情,或者应该将其作为不正确的行为提交给NHibernate bugtracker吗?
答案 0 :(得分:1)
我认为你找到了一个合法的错误。
生成的映射应为:
<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中分叉,修复它(不破坏任何测试)并提交拉取请求。