2009-05-05 58 views
4

我有一个Contact(基类),一个叫做Customer的类和一个叫做Supplier的类。客户和供应商类别均来自Contact。如何在NHibernate中映射集合<T>?

客户与订单有0..n的关系。我想要在客户端拥有一个Collection属性,并将其映射到NHibernate中的相应表中。

NHibernate(版本2.0.1 GA)是如何完成的?

(PS:使用.NET 3.5 SP1,VS2008 SP1)

+0

是您的收藏有序?我的意思是:您是否期望在存储数据库并从数据库中取回数据后,它们的顺序相同? – 2009-05-05 13:36:42

+0

收藏必须以我向其添加项目的方式进行存储。因此,添加orderA,orderB,orderC并再次读取它,它必须按此顺序保持orderA,orderB和orderC。 – 2009-05-05 14:00:23

回答

4

这是这样完成的:

这样创建类:

public class Customer : Contact 
{ 
    private ISet<Order> _orders = new HashedSet<Order>(); 

    public Collection<Order> Orders 
    { 
     return new List<Order>(_orders); 
    } 

    // NOrmally I would return a ReadOnlyCollection<T> instead of a Collection<T> 
    // since I want to avoid that users add Orders directly to the collection. 
    // If your relationship is bi-directional, then you have to set the other 
    // end of the association as well, in order to hide this for the programmer 
    // I always create add & remove methods (see below) 

    public void AddOrder(Order o) 
    { 
     if(o != null && _orders.Contains(o) == false) 
     { 
     o.Customer = this; 
     _orders.Add(o); 
     } 
    } 
} 
在映射

,你指定了这个:

<set name="Orders" table="OrdersTable" access="field.camelcase-underscore" inverse="true"> 
    <key column="..." /> 
    <one-to-many class="Order" .. /> 
</set> 

既然你使用继承,你应该明确地看看不同的可能性关于继承映射在NHibernate的,并选择最适合自己情况的策略IES: inheritance mapping

关于设置&袋语义: - 当你映射一个集合为一组,你可以确保所有映射集合中的实体是唯一的。也就是说,NHibernate将确保在重构​​实例的同时,集合不会包含重复项。 - 将集合映射为包时,从数据库加载对象时,您的集合可能会多次包含相同的实体。

  • 一个集合是一个整体被认为是不同的对象的集合。 A 一组(字母) 的有效示例是:{a,b,c,d}。每个字母 只发生一次。
  • 一个袋子是一个集合的泛化。 A 包的成员可以有多个 一个成员资格,而 集的每个成员只有一个成员资格。一个有效的袋子例子是{a,a,a,b,c, c,d,...}。字母a和c 在包中出现多次。
+0

你的速度更快...继承的描述,以及 - http://ayende.com/Blog/archive/2009/04/10/nhibernate-mapping-ndash-inheritance.aspx – Rashack 2009-05-05 12:18:13

1

,如果你不喜欢用一套从Iesi填入收藏

public class Customer : Contact 
{ 
    public ICollection<Order> Orders 
    { 
     get; private set; 

    } 
} 

和映射这样的另一种解决方案:

<bag name="Orders" table="Customer_Orders" > 
    <key column="Customer_FK" /> 
    <composite-element> 
    <property name="OrderNumber" /> 
    <property name="OrderName" /> 
    <!-- ... --> 
    </composite-element> 
</set>