2011-01-12 65 views
2


我想用Nhibernate 3.0開發我的第一個項目。 我經歷了大量材料(博客,論文和樣本),我認爲我可以理解基本知識。
我想我已經理解了不同類型的收集的含義,但比當我看到互聯網上發現的例子時,我認爲我還沒有真正理解。
該文檔說,如果您希望允許重複項目時不需要重複項和列表/包,則應該使用Set。 我發現的大多數樣本都是基於您訂單/訂單行的典型情況。 如果我有訂單的查找映射文件,我可以看到這樣的事情:NHibernate和集合類型

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

我expcted看到映射爲一個集的OrderItems;訂單將有獨特的OrderItems?
對嗎? 同時,我希望找到一個映射類產品的OrderItems

... 

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

... 

在這種情況下一個產品將具有非唯一的OrderItems的名單袋。
我有什麼遺漏?
原諒我所有的愚蠢的問題:-s

回答

1

原因是Yads回答說,包映射與.NET映射兼容。集合通常以這種方式映射,以避免在類中引用Iesi.Collections。

使用NHibernate 2.1,您可以使用集合映射,將集合聲明爲ICollection<T>並將其初始化爲HashSet<T>。使用NHibernate 3我相信你可以將集合聲明爲ISet<T>

我同意大多數現實世界的集合應該映射爲集合。

+0

謝謝傑米,這正是我所做的:我宣佈集合爲ICollection 並初始化爲HashSet 因爲我不想引用Iesi.Collections。 – LeftyX 2011-01-12 22:10:19

0

大多數人實現它作爲一個包,是因爲他們可以使用內置的列表<>類或IList的<>接口來代表他們收集的原因。

+0

是的,但列表允許你有重複,在這種情況下(OrderLines)你應該允許。 – LeftyX 2011-01-12 22:04:49

2

我將它設置爲<list ...>,就像在我的書中一樣,兩個具有相同特徵的命令行是相同的(.Equals應該返回true) - 許多人認爲命令行的順序(!)是重要的。 :-)

+0

你能解釋一下嗎?你可以有兩個具有相同特徵的命令行?我失去了一些東西... – LeftyX 2011-01-12 22:06:29