【问题标题】:NHibernate not mapping inherited properties with ComposedIdNHibernate 不使用 ComposedId 映射继承的属性
【发布时间】: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 的表,其中包含两列:InheritedIdOwnId,以及由这两列组成的主键.

实际结果

数据库中名为Subclass的表,其中包含两列:InheritedIdOwnId,主键由只是OwnId

解决方法

如果我将属性复制到 Subclass(将其标记为 new),上述操作就可以了。

假设

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

救命!

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

【问题讨论】:

    标签: nhibernate nhibernate-mapping


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

    【讨论】:

    • 感谢您的确认。我会环顾四周,看看我是否能找出为什么会这样,以及它是一个简单的修复还是太复杂,以我对 NHibernate 架构的有限知识无法处理。
    • 经过进一步挖掘后,它似乎不一定是一个错误。 NHibernate 更愿意将超类中的属性映射到单独的映射中并映射到单独的表中。现在我想看看我是否可以在 Loquacious 中以某种方式强制每个具体类的 table-per-concrete-class,以及它是否会产生允许我在子类中映射 InheritedId 的预期结果。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多