【问题标题】:NHibernate and collection typesNHibernate 和集合类型
【发布时间】:2011-01-13 04:11:28
【问题描述】:


我正在尝试使用 Nhibernate 3.0 开发我的第一个项目。 我浏览了大量材料(博客、论文和示例),我认为我可以理解基本知识。
我想我已经理解了不同类型集合的含义,但是当我看到网上找到的例子时,我觉得我还没有真正理解。
文档说当你不想重复时你应该使用 Set ,当你想要允许重复时应该使用 List/Bag 。 我发现的大多数示例都是基于您有 Orders/OrderLines 的典型情况。 如果我查看订单的映射文件,我会看到如下内容:

<class name="OrderHeader"
        table="Orders">
    <id name="OrderId">
        <generator class="hilo"/>
    </id>
    <property name="OrderDate"/>
    <bag name="OrderItems" table="OrderDetails" cascade="all" inverse="true">
        <key column="OrderId"/>
        <one-to-many class="OrderDetail"/>
    </bag>
</class>

<class name="OrderDetail"
        table="OrderDetails">
    <id name="DetailId">
        <generator class="hilo"/>
    </id>
    <many-to-one name="ProductOrdered" column="ProductId"/>
    <many-to-one name="Order" column="OrderId" />
</class>

我曾期望看到 OrderItems 映射为一个集合;一个订单会有唯一的 OrderItems 吗?
我对吗? 同时,我希望找到一个类 Product 的映射,一包 OrderItems

...  

<bag lazy="true" name="OrderItems">
  <key foreign-key="FK_OrderItems_Products">
    <column name="ProductCode" />
  </key>
  .....  
</bag>

...  

在这种情况下,产品会有一个非唯一的 OrderItem 列表。
我有什么遗漏吗?
原谅我这个愚蠢的问题:-s

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    我会将其设置为&lt;list ...&gt;,因为在我的书中,两个具有相同特征的订单线是相同的(.Equals 应该返回 true)——而且,许多人认为订单线的顺序(!)很重要。 :-)

    【讨论】:

    • 你能解释一下吗?你可以有两个具有相同特征的订单线吗?我错过了一些东西......
    • 1 件。椅子 400 美元 == 1 件。椅子 400 美元。出于某种原因,许多客户希望在两个订单行之间拆分相同类型的产品来解释某种关系。
    • 谢谢你的解释,地精。
    【解决方案2】:

    原因是包映射与 Yads 回答的 .NET IList&lt;T&gt; 映射兼容。集合通常以这种方式映射以避免在您的类中引用 Iesi.Collections。

    使用 NHibernate 2.1,您可以通过将集合声明为 ICollection&lt;T&gt; 并将其初始化为 HashSet&lt;T&gt; 来使用集合映射。使用 NHibernate 3 我相信您可以将集合声明为ISet&lt;T&gt;

    我同意大多数现实世界的集合应该映射为集合。

    【讨论】:

    • 感谢 Jamie,这正是我所做的:我已将集合声明为 ICollection 并初始化为 HashSet,因为我不想引用 Iesi.Collections。跨度>
    【解决方案3】:

    大多数人将其实现为包的原因是因为他们可以使用内置的 List 类或 IList 接口来表示他们的集合。

    【讨论】:

    • 是的,但是 List 允许您有重复项,在这种情况下(OrderLines)您应该允许这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多