Каскадное удаление для необязательных обратных объединений

Существует одно упрощенное отображение для одного из наших классов сущностей:

 <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>

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

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

Мы хотели бы, чтобы NHibernate удалил связанный tOneToOneComponent, когда родительский объект будет удален.

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

Таким образом, мы добавили on-delete="cascade" к но теперь, когда мы удаляем Parent, SQL говорит:

The DELETE statement conflicted with the REFERENCE constraint

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

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

1 ответ

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

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