У меня есть два отображения Nhibernate для двух классов: Категория и Продукт.Мой класс Category имеет два свойства, которые являются коллекциями.Свойство Children представляет собой коллекцию типа Category, которая представляет дочерние категории (представляет меню категорий, типичный сценарий родительских дочерних элементов).Второе свойство в классе Category - это коллекция Products, в которой представлены все товары в категории.
Я пытаюсь добиться того, чтобы при удалении категории я хотел удалить категорию, но не продукт.Поэтому я хочу, чтобы продукт был осиротевшим.т.е. его внешний ключ (CategoryId) в таблице Product установлен на нуль.Я не хочу удалять продукт только потому, что удалил категорию.Я хочу иметь возможность позже переназначить другую категорию.Мои сопоставления, представляющие упомянутый сценарий, приведены ниже.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="naakud.domain" namespace="naakud.domain">
<class name="Category">
<id name="Id">
<generator class="hilo" />
</id>
<version name="Version"/>
<property name="Name" not-null="true" unique="true" />
<set name="Products"
cascade="save-update"
inverse="true"
access="field.camelcase-underscore">
<key column="CategoryId" foreign-key="fk_Category_Product" />
<one-to-many class="Product" />
</set>
<many-to-one name="Parent" class="Category" column="ParentId" />
<set name="Children"
collection-type="naakud.domain.Mappings.Collections.TreeCategoriesCollectionType, naakud.domain"
cascade="all-delete-orphan"
inverse="true"
access="field.camelcase-underscore">
<key column="ParentId" foreign-key="fk_Category_ParentCategory" />
<one-to-many class="Category"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="naakud.domain" namespace="naakud.domain">
<class name="Product">
<id name="Id">
<generator class="hilo" />
</id>
<version name="Version" />
<property name="Name" not-null="true" unique="true" />
<property name="Description" not-null="true" />
<property name="UnitPrice" not-null="true" type="Currency" />
<many-to-one name="Category" column="CategoryId" />
</class>
</hibernate-mapping>
При этом сопоставлении при удалении категории, с которой связаны продукты, я получаю следующую ошибку ограничения.
Конфликт оператора DELETEс ограничением ССЫЛКА "fk_Category_Product".Конфликт произошел в базе данных "naakud", таблице "dbo.Product", столбце "CategoryId".Оператор был прерван.
Однако, когда я удаляю атрибут inverse = true в коллекции Products в отображении категории, он работает нормально.Для моего внешнего ключа CategoryId в таблице товаров установлено нулевое значение, и, следовательно, продукт не связан с категорией.Это то, что я хочу.
Я прочитал об обратном атрибуте, и я понимаю, что это означает, что он является стороной-владельцем отношений, а обновления / вставки / удаления выполняются в другом порядке, поэтому я считаю, что это решаетпроблема.Итак, мой вопрос, правильно ли я решаю свою проблему?Как это влияет на производительность?(не так много, я подозреваю).Было бы лучше иметь однонаправленные отношения без множества в одну сторону и установить для обратного атрибута значение true, чтобы повысить производительность?Или я схожу с ума и совершенно упускаю суть?