在我看来这是一个错误,但在我将它提交给 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组成的主键。
解决方法
如果我将属性复制到子类(将其标记为new
),则上述工作正常。
假设
从查看 NHibernate 源代码看来,该TypeExtensions.DecodeMemberAccessExpression()
方法返回的InheritedId的MemberInfo将BaseClass指定为其ReflectedType,而稍后当最终解析声明的模型时,返回将Subclass指定为反射类型的MemberInfo 。两者是不同的,因此无法在之前编译的ComposedIds中找到它来映射它。typeof(Subclass).GetProperties()
ModelMapper.MapRootClass()
帮助!
你遇到过这个问题吗?我是在做一些奇怪的事情还是应该将其作为不正确的行为提交给 NHibernate bugtracker?