NHibernate 一对多映射不填充包

标签 nhibernate nhibernate-mapping

我有一个带有多个详细信息行的标题的简单对象模型。我已将 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/

相关文章:

fluent-nhibernate - 如何在 Fluent NHibernate 中将 "cascade delete"选项设置为 "Set Null"?

hibernate - 如何将 2 个相同的表(相同的属性)映射到 1 个实体

nhibernate - 如何持久化对象的子集而不是整个对象?

Nhibernate - 查询没有关系的连接表

c# - NHibernate 搜索 - 多个 Web 服务器

nhibernate - Fluent NHibernate 映射到没有暴露属性的私有(private)/ protected 字段

c# - Nhibernate - 创建 SQLQuery - IndexOutOfRangeException

nhibernate - Entity Framework 成功案例?

nhibernate - nhibernate中的属性访问策略

c# - QueryOver: 选择 ... where property in (...)