我有一个类Contact(基类),一个名为Customer的类和一个名为Supplier的类。客户和供应商类均来自Contact。
客户与订单的关系为0..n。我希望在客户上有一个Collection属性,并将它在NHibernate中映射到相应的表。
如何在NHibernate(版本2.0.1 GA)中完成?
(ps:使用.NET 3.5 SP1,VS2008 SP1)
答案 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将确保在重构实例时,该集合不会包含重复项。 - 当您将集合映射为包时,从数据库加载对象时,您的集合可能会包含多个相同的实体。
答案 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>