0

Существует следующая упрощенная отображение для одного из классов объектов:каскадных удаления для дополнительного обратнога присоединяется

<class name="Parent" table="tParent"> 
    <id name="Id"> 
     <column name="ParentId" sql-type="bigint"/> 
     <generator class="native"/> 
    </id> 
    <join table="tOneToOneComponent" optional="true" inverse="true"> 
     <key column="ParentId" on-delete="cascade"/> 
     <property name="Someprop"/> 
    </join> 
    </class> 

В принципе, это один-к-одному с внешним ключом с другой стороны отношения (это почему мы устанавливаем «обратный»). Кроме того, у родителя могут быть какие-либо записи в tOneToOneComponent (так что необязательно = «true»).

Я знаю, что такие объединения не рекомендуются, но у нас есть немного старая и большая система, и у нас нет времени на ее редизайн.

Мы хотели бы, чтобы NHibernate удалял связанный с ним компонент TOneToOneComponent при удалении родителя.

Конечно, мы могли бы каскадировать операцию удаления на SQL-сервере, но тогда нам нужно очистить кеш-память NHibernate, чтобы гарантировать, что tOneToOneComponent не останется где-то в кеше.

Таким образом, мы добавили на удаление = «каскад» к, но теперь, когда мы удаляем Родитель, SQL говорит:

The DELETE statement conflicted with the REFERENCE constraint 

кажется, NHibernate пытается удалить записи в неправильном порядке.

Как сообщить NHibernate сначала удалить tOneToOneComponent (если он существует) и только потом удалить родителя?

ответ

1

Что вы хотите - это поведение по умолчанию, которое переопределяется Inverse(), который сообщает ему, что он не должен удалять другую часть вообще, поскольку она принадлежит самому себе. Либо избавиться от Inverse(), либо удалить delete по-другому.

Смежные вопросы