NHibernate и коллекционные типы - PullRequest
2 голосов
/ 12 января 2011


Я пытаюсь разработать свой самый первый проект с помощью Nhibernate 3.0.Я просмотрел множество материалов (блоги, документы и образцы), и я думаю, что могу понять основы, в значительной степени.
Я думаю, что я понял значение различных типов коллекций, но когда я вижу примерынайденный в Интернете, я думаю, что я действительно не понял.
Документация говорит, что вы должны использовать Set, если вы не хотите дублировать, и List / Bag, когда вы хотите разрешить дублирование.Большинство образцов, которые я нашел, основаны на типичной ситуации, когда у вас есть Order / OrderLines.Если я посмотрю файл отображения Ордена, то у меня получится что-то вроде этого:

<class name="OrderHeader"
        table="Orders">
    <id name="OrderId">
        <generator class="hilo"/>
    </id>
    <property name="OrderDate"/>
    <bag name="OrderItems" table="OrderDetails" cascade="all" inverse="true">
        <key column="OrderId"/>
        <one-to-many class="OrderDetail"/>
    </bag>
</class>

<class name="OrderDetail"
        table="OrderDetails">
    <id name="DetailId">
        <generator class="hilo"/>
    </id>
    <many-to-one name="ProductOrdered" column="ProductId"/>
    <many-to-one name="Order" column="OrderId" />
</class>

Я ожидал увидеть OrderItems, сопоставленные как Set;заказ будет иметь уникальные элементы OrderItems?
Я прав?В то же время я ожидал бы найти сопоставление для класса Product bag of OrderItems

...  

<bag lazy="true" name="OrderItems">
  <key foreign-key="FK_OrderItems_Products">
    <column name="ProductCode" />
  </key>
  .....  
</bag>

...  

В этой ситуации у продукта будет список неуникальных OrderItems.
Есть ли что-нибудьЯ скучаю?
Простите меня за глупый вопрос: -s

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Я бы установил его как <list ...>, так как в моей книге две строки заказа с одинаковыми характеристиками идентичны (.Equals должен возвращать true) - также многие считают порядок (!) Строк заказа очень важным. : -)

1 голос
/ 12 января 2011

Причина этого заключается в том, что отображение пакетов совместимо с отображением .NET IList<T>, как ответил Ядс. Коллекции обычно отображаются таким образом, чтобы не ссылаться на Iesi.Collections в ваших классах.

В NHibernate 2.1 вы можете использовать сопоставление наборов, объявив коллекцию как ICollection<T> и инициализировав ее как HashSet<T>. Используя NHibernate 3, я считаю, что вы можете объявить коллекцию как ISet<T>.

Я согласен, что большинство реальных коллекций должны отображаться как наборы.

0 голосов
/ 12 января 2011

Причина, по которой большинство людей реализует ее как пакет, заключается в том, что они могут использовать встроенный интерфейс List <> или интерфейс IList <> для представления своей коллекции.

...