NHibernate一对多映射不会填充包

NHibernate一对多映射不会填充包,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个简单的标题对象模型,带有多条细节线。我已经将header对象上的一个bag属性映射到line类,并且在line类上放置了一个header属性来设置双向关系 当我运行测试时,使用NHibernate Profiler,我可以看到正在执行查询,并且从数据库中获取了头和行,但是集合总是空的 当我直接查询行对象的集合时,我可以得到它们,并查看header对象是否正确填充,因此我知道映射可能是正确的 这有点不标准,因为line对象有一个复合键。(这是一个遗留数据库,我无法更改),因此我想知道这是否

我有一个简单的标题对象模型,带有多条细节线。我已经将header对象上的一个bag属性映射到line类,并且在line类上放置了一个header属性来设置双向关系

当我运行测试时,使用NHibernate Profiler,我可以看到正在执行查询,并且从数据库中获取了头和行,但是集合总是空的

当我直接查询行对象的集合时,我可以得到它们,并查看header对象是否正确填充,因此我知道映射可能是正确的

这有点不标准,因为line对象有一个复合键。(这是一个遗留数据库,我无法更改),因此我想知道这是否是问题所在

下面是我的类和映射(简化)


公共类标题{
公共虚拟字符串ID{get;set;}
公共虚拟IList行{get;set;}
}
公共班级线{
公共虚拟字符串ID{get;set;}
公共虚拟整数行{get;set;}
公共虚拟头{get;set;}
公共覆盖布尔等于(对象对象对象){
var other=obj as线;
返回ID==other.ID&&Line==other.Line;
}
公共覆盖int GetHashCode(){
return(ID+“|”+Line.ToString()).GetHashCode();
}
}
我可以通过单独查询线条对象来解决这个问题,但我想知道我做错了什么


编辑:好吧,当我简化事情时,我并没有始终如一地做。很抱歉给你带来了困惑。我已经更改了映射和类定义,以更准确地反映情况。

您将映射同一列两次(BODY\u HEADER\u ID),并为HEADER表使用三个不同的类名

这是正确的线映射:

<class name="Line" table="BODY">
  <composite-id>
    <key-many-to-one class="Header" name="Header" column="BODY_HEADER_ID"/>
    <key-property name="Line" column="SBODY_LINE"/>
  </composite-id>
</class>


当然,行应该只有一个标题引用。

也可以在关系的一侧或另一侧使用“Inverse=true”。apollo是对的。袋子应该是反向的,可能也是cascade=“all”。@Diego我只看到标题表的两个类名:标题和工资单(未显示其映射)。第三个在哪里?@apollo这个班用的是“头”而不是“头”谢谢。我不知道“关键多对一”映射。
<class name="Line" table="BODY">
  <composite-id>
    <key-many-to-one class="Header" name="Header" column="BODY_HEADER_ID"/>
    <key-property name="Line" column="SBODY_LINE"/>
  </composite-id>
</class>