2011-01-12 62 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