NHibernate和集合类型

时间:2011-01-12 19:01:26

标签: nhibernate nhibernate-mapping


我正在尝试使用Nhibernate 3.0开发我的第一个项目。 我已经浏览了很多材料(博客,论文和样本),我想我几乎可以理解基础知识。
我想我已经理解了不同类型的收藏的含义,但是当我看到互联网上的例子时,我想我还没有真正理解。
文档说当你不想要重复时你应该使用Set,当你想要允许重复时你应该使用List / Bag。 我发现的大多数样本都是基于Orders / OrderLines的典型情况。 如果我看一下Order I的映射文件,可以看到如下内容:

<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映射为Set;订单将具有唯一的OrderItems?
我对吗? 与此同时,我希望找到一个产品包的OrderItems

的映射
...  

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

...  

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

大多数人将其作为包使用的原因是因为他们可以使用内置的List&lt;&gt; class或IList&lt;&gt;用于表示其集合的界面。