包含集合的Nhibernate嵌套复合元素

时间:2015-01-21 12:37:03

标签: c# nhibernate nhibernate-mapping

我有一个enity'Foo',它包含一组值对象'Person',person包含简单属性,如“name”和一组值对象'NameChange',它是有关以前人名的信息。

我想把它映射为:

<class name="Foo">
  <bag name="Persons">
    <composite-element class="Person">
      <property name="Name"/>
      <bag name="NameChanges"> <!--WRONG-->
        <composite-element class="NameChange">
          <property name="ExName"/>
        </composite-element>
      </bag>
    </composite-element>
  </bag>
</class>

但NH不允许这种映射。

如何在值对象中映射值对象的集合?

1 个答案:

答案 0 :(得分:1)

检查文档:

7.2. Collections of dependent objects

  

支持组件集合(例如,Name类型的数组)。通过用标记替换标记来声明组件集合。

<set name="SomeNames" table="some_names" lazy="true">
    <key column="id"/>
    <composite-element class="Eg.Name, Eg"> <!-- class attribute required -->
        <property name="Initial"/>
        <property name="First"/>
        <property name="Last"/>
    </composite-element>
</set>
  

注意:如果定义复合元素的ISet,则正确实现Equals()和GetHashCode()非常重要。

     

复合元素可能包含但不包含集合。如果复合元素本身包含组件,请使用 <nested-composite-element> 标记。 这是一个非常奇特的案例 - 一系列组件本身就有组件。在这个阶段你应该问自己一对多关联是否更合适......

所以回答你的问题:

  

如何在值对象中映射值对象的集合?

不要那样做。创建一级公民实体,并使用one-to-many映射它们。一旦你被要求提供过滤,你会获得很多...

也许检查类似的内容here ...我的建议/建议是:主要使用one-to-manymany-to-one ...我做99.7%的案例< / em>的