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<> для представления своей коллекции.