2009-05-05 5 views
4

У меня есть класс Contact (базовый класс), класс Customer и класс, называемый Поставщиком. Класс клиентов и поставщиков определяется как «Контакт».Как нарисовать коллекцию <T> в NHibernate?

Клиент имеет отношение 0..n к заказу. Я хочу иметь свойство Collection на клиенте и сопоставить его в NHibernate с соответствующей таблицей.

Как это делается в NHibernate (версия 2.0.1 GA)?

(пс: с использованием .NET 3.5 SP1, VS2008 SP1)

+0

заказанная ваша коллекция? Я имею в виду: ожидаете ли вы элементы в том же порядке после сохранения и возврата из базы данных? –

+0

Коллекция должна храниться так, как я добавил к ней предметы. Таким образом, добавляя orderA, orderB, orderC и снова считывая его, он должен содержать orderA, orderB и orderC в этом порядке. –

ответ

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> 

Поскольку вы используете наследование, вы должны определенно взглянуть на разные posibilit х годов, касающиеся наследования отображение в NHibernate, и выбрать стратегию, которая лучше всего подходит для вашей ситуации: inheritance mapping

Что касается установленных & мешок семантики: - когда карта коллекции в виде набора, вы можете быть уверены, что все объекты в сопоставленной коллекции уникальны. То есть, NHibernate будет следить за тем, чтобы при восстановлении экземпляра коллекция не содержала дубликатов. - когда вы собираете коллекцию в сумке, возможно, что ваша коллекция будет содержать один и тот же объект более одного раза при загрузке объекта из БД.

  • A Комплект представляет собой набор различных объектов, рассматриваемых в целом. 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

+0

Я использую Collection в моем примере .. это все еще возможно? –

+0

Это все еще возможно, но в моем примере частный участник _orders должен иметь тип ISet, поскольку он отображается как набор. Если вы хотите, чтобы _orders являлся списком , например, вам нужно будет сопоставить его как сумку. (Но мешочные отображения имеют другую семантику, а затем набор-отображения). Если вы изменили тип возвращаемого значения для общего ресурса Orders для коллекции, это не проблема (в этом примере), поскольку общедоступное свойство не используется NHibernate, но частное поле (следовательно, атрибут доступа в отображении) –

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> 
+1

еще лучше: http://feedproxy.google.com/~r/AyendeRahien/~3/etKiA3Njx-c/nhibernate-tidbit-ndash-using-ltsetgt-without-referencing-iesi.collections.aspx –