1

在我看来这是一个错误,但在我将它提交给 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的表,其中包含两列:InheritedIdOwnId,以及由这两列组成的主键。

实际结果

数据库中名为Subclass的表,其中包含两列:InheritedIdOwnId ,以及仅由OwnId组成的主键。

解决方法

如果我将属性复制到子类(将其标记为new),则上述工作正常。

假设

从查看 NHibernate 源代码看来,该TypeExtensions.DecodeMemberAccessExpression()方法返回的InheritedId的MemberInfo将BaseClass指定为其ReflectedType,而稍后当最终解析声明的模型时,返回将Subclass指定为反射类型的MemberInfo 。两者是不同的,因此无法在之前编译的ComposedIds中找到它来映射它。typeof(Subclass).GetProperties()ModelMapper.MapRootClass()

帮助!

你遇到过这个问题吗?我是在做一些奇怪的事情还是应该将其作为不正确的行为提交给 NHibernate bugtracker?

4

1 回答 1

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 上 fork ,修复它(不破坏任何测试)并提交一个拉取请求。

于 2012-08-28T22:41:41.607 回答