NHibernate未映射具有ComposeId的继承属性

NHibernate未映射具有ComposeId的继承属性,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,在我看来,这是一个bug,但在我将其提交给NHibernate bugtracker之前,我想确认我对该如何工作的理解 我的项目配置为使用显式模型映射,并在每次运行时恢复数据库。我有一个定义属性的简单基类。子类希望将该属性与其自己的属性组合,以生成复合主键,如下所示: public class BaseClass { public int InheritedId { get; set; } } public class Subclass : BaseClass { public

在我看来,这是一个bug,但在我将其提交给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);
        });
    }
}
公共类基类
{
public int inheriteId{get;set;}
}
公共类子类:基类
{
public int OwnId{get;set;}
}
公共类子类映射:类映射
{
公共子类映射()
{
表(“子类”);
复合ID(x=>{
x、 属性(p=>p.inheritedd);
x、 属性(p=>p.OwnId);
});
}
}
预期结果 我的数据库中有一个名为Subclass的表,其中有两列:InheriteId和OwnId,主键由这两列组成

实际结果 数据库中名为Subclass的表,其中有两列:InheriteId和OwnId,主键仅由OwnId组成

权变措施 如果我将属性复制到子类(将其标记为
new
),上述操作就可以了

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

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

我想你已经发现了一个合法的bug

生成的映射应为:

<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中插入它,修复它(不破坏任何测试)并提交请求。

我认为您已经找到了一个合法的bug

生成的映射应为:

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

谢谢您的确认。我会四处看看,看看是否能找到原因,以及这是一个简单的修复还是太复杂,我无法用有限的NHibernate架构知识来处理。进一步挖掘后,似乎不一定是一个bug。NHibernate更愿意在单独的映射中将属性从超类映射到单独的表。现在我想看看我是否可以在Loquacious中强制每个具体类使用table,以及它是否会产生允许我在子类中映射
InheritedId
的预期结果。谢谢您的确认。我会四处看看,看看是否能找到原因,以及这是一个简单的修复还是太复杂,我无法用有限的NHibernate架构知识来处理。进一步挖掘后,似乎不一定是一个bug。NHibernate更愿意在单独的映射中将属性从超类映射到单独的表。现在,我想看看我是否可以在Loquacious中强制每个具体类使用table,以及它是否会产生允许我在子类中映射
InheritedId
的预期结果。