NHibernate и коллекционные типы


Я пытаюсь разработать свой самый первый проект с помощью 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.
Я что-то пропустил?
Прости меня все за глупый вопрос

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам