NHibernate没有使用ComposedId映射继承的属性

时间:2012-08-28 13:27:10

标签: nhibernate nhibernate-mapping

在我看来,这是一个错误,但是在我将其提交给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吗?

1 个答案:

答案 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中分叉,修复它(不破坏任何测试)并提交拉取请求。