【发布时间】:2012-08-29 06:41:41
【问题描述】:
在我看来这是一个错误,但在我将它提交给 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() 返回将 Subclass 指定为反射类型的 MemberInfo。两者是不同的,因此ModelMapper.MapRootClass() 无法在 ComposedIds 中找到它以映射它之前编译。
救命!
你遇到过这个问题吗?我是在做一些奇怪的事情还是应该将其作为不正确的行为提交给 NHibernate bugtracker?
【问题讨论】:
标签: nhibernate nhibernate-mapping