如何在NHibernate中映射Collection <t>?</t>

时间:2009-05-05 12:10:20

标签: c# visual-studio-2008 nhibernate

我有一个类Contact(基类),一个名为Customer的类和一个名为Supplier的类。客户和供应商类均来自Contact。

客户与订单的关系为0..n。我希望在客户上有一个Collection属性,并将它在NHibernate中映射到相应的表。

如何在NHibernate(版本2.0.1 GA)中完成?

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

2 个答案:

答案 0 :(得分: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中有关继承映射的不同可能性,并选择最适合您情况的策略: inheritance mapping

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

  • Set是一个不同的集合 对象被视为一个整体。一个 一组(字母)的有效示例 是:{a,b,c,d}。每封信 恰好发生一次。
  • A Bag是一组的概括。一个 一个包的成员可以有多个 每个成员的一个成员 集合只有一个成员资格。一个有效的 包的例子是{a,a,a,b,c, c,d,...}。字母a和c 袋子里不止一次出现。

答案 1 :(得分: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>