我有一个Contact(基类),一个叫做Customer的类和一个叫做Supplier的类。客户和供应商类别均来自Contact。如何在NHibernate中映射集合<T>?
客户与订单有0..n的关系。我想要在客户端拥有一个Collection属性,并将其映射到NHibernate中的相应表中。
NHibernate(版本2.0.1 GA)是如何完成的?
(PS:使用.NET 3.5 SP1,VS2008 SP1)
我有一个Contact(基类),一个叫做Customer的类和一个叫做Supplier的类。客户和供应商类别均来自Contact。如何在NHibernate中映射集合<T>?
客户与订单有0..n的关系。我想要在客户端拥有一个Collection属性,并将其映射到NHibernate中的相应表中。
NHibernate(版本2.0.1 GA)是如何完成的?
(PS:使用.NET 3.5 SP1,VS2008 SP1)
这是这样完成的:
这样创建类:
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将确保在重构实例的同时,集合不会包含重复项。 - 将集合映射为包时,从数据库加载对象时,您的集合可能会多次包含相同的实体。
你的速度更快...继承的描述,以及 - http://ayende.com/Blog/archive/2009/04/10/nhibernate-mapping-ndash-inheritance.aspx – Rashack 2009-05-05 12:18:13
,如果你不喜欢用一套从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>
是您的收藏有序?我的意思是:您是否期望在存储数据库并从数据库中取回数据后,它们的顺序相同? – 2009-05-05 13:36:42
收藏必须以我向其添加项目的方式进行存储。因此,添加orderA,orderB,orderC并再次读取它,它必须按此顺序保持orderA,orderB和orderC。 – 2009-05-05 14:00:23