gpt4 book ai didi

NHibernate 一对多映射不填充包

转载 作者:行者123 更新时间:2023-12-04 06:50:00 25 4
gpt4 key购买 nike

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

当我运行测试时,使用 NHibernate Profiler 我可以看到正在执行查询,并且从数据库中获取标题和行,但集合始终为空。

当我直接查询线对象的集合时,我可以获得它们并看到标题对象已正确填充,因此我知道映射可能没问题。

稍微不标准的方面是线对象有一个复合键。 (这是一个遗留数据库,我无法更改它),所以我想知道这是否是问题所在。

这是我的类和映射(简化)

  <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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com