NHibernate和集合类型

NHibernate和集合类型,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我正试图用Nhibernate 3.0开发我的第一个项目。 我已经阅读了大量的资料(博客、论文和样本),我认为我可以大致了解基本知识。 我想我已经理解了不同类型收藏的含义,但当我看到互联网上的例子时,我想我还没有真正理解。 文档中说,如果不需要重复项,则应使用集合;如果希望允许重复项,则应使用列表/包。 我发现的大多数示例都基于一种典型情况,即您有订单/订单行。 如果我查看订单的映射文件,我可以看到如下内容: <class name="OrderHeader" table=


我正试图用Nhibernate 3.0开发我的第一个项目。 我已经阅读了大量的资料(博客、论文和样本),我认为我可以大致了解基本知识。
我想我已经理解了不同类型收藏的含义,但当我看到互联网上的例子时,我想我还没有真正理解。
文档中说,如果不需要重复项,则应使用集合;如果希望允许重复项,则应使用列表/包。 我发现的大多数示例都基于一种典型情况,即您有订单/订单行。 如果我查看订单的映射文件,我可以看到如下内容:

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

...  
。。。
.....  
...  
在这种情况下,产品将有一个非唯一订单项列表。
我还缺什么吗?

请原谅我的愚蠢问题:-s

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

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

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


<>我同意大多数真实世界的集合应该被映射为集合。< /P> < p>我将它设置为<代码> <代码>,如在我的书中,具有相同特性的两个命令行都是相同的(相等的应该返回true)。p> 是的,但是列表允许您有重复项,在这种情况下(订单行),您应该允许。您能解释一下吗?您可以有两个具有相同特征的订单行吗?我错过了一些东西…一张400美元的椅子=一张400美元的椅子。出于某些原因,许多客户希望在两个订单行之间拆分相同类型的产品,以解释某种关系。感谢您的解释,Goblin。感谢Jamie,这正是我所做的:我已将集合声明为ICollection并初始化为HashSet,因为我不想引用Iesi.Collections。