我正在尝试使用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
答案 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;用于表示其集合的界面。