我有一个带有多个详细信息行的标题的简单对象模型。我已将 header 对象上的 bag 属性映射到 line 类,并将 header 属性放在 line 类上以设置双向关系。
当我使用 NHibernate Profiler 运行测试时,我可以看到正在执行查询,并且从数据库中获取标题和行,但集合始终为空。
当我直接查询线条对象集合时,我可以获得它们并看到 header 对象已正确填充,因此我知道映射可能没问题。
稍微不标准的一点是线条对象有一个复合键。 (这是一个遗留数据库,我无法更改它),所以我想知道这是否是问题所在。
这是我的类和映射(简化)
<class name="Header" table="HEADER">
<id name="ID" column="HEAD_ID">
<generator class="assigned" />
</id>
<bag name="Lines" table="BODY" order-by="BODY_LINE">
<key column="BODY_HEADER_ID"/>
<one-to-many class="Line"/>
</bag>
</class>
<class name="Line" table="BODY">
<composite-id>
<key-property name="ID" column="BODY_HEADER_ID"/>
<key-property name="Line" column="SBODY_LINE"/>
</composite-id>
<many-to-one class="Header" name="Head" column="BODY_HEADER_ID" />
</class>
public class Header {
public virtual string ID { get; set; }
public virtual IList<Line> Lines { get; set; }
}
public class Line {
public virtual string ID { get; set; }
public virtual int Line { get; set; }
public virtual Header Head { get; set; }
public override bool Equals(object obj) {
var other = obj as Line;
return ID == other.ID && Line == other.Line;
}
public override int GetHashCode() {
return (ID + "|" + Line.ToString()).GetHashCode();
}
}
我可以通过单独查询 Line 对象来解决这个问题,但我想知道我做错了什么。
编辑:好吧,当我简化事情时,我并没有做得非常一致。对困惑感到抱歉。我更改了映射和类定义以更准确地反射(reflect)事物。
最佳答案
您将同一列映射两次 (BODY_HEADER_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>
当然,Line 应该只有对 Header 的单个引用。
关于NHibernate 一对多映射不填充包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266136/