Nhibernate: Удалить детей-сирот, но не удалять детей при удалении родителя - PullRequest
4 голосов
/ 23 декабря 2011

Я ищу способ настроить nhibernate так, чтобы дочерние сущности-сироты автоматически удалялись, но если родительский объект удален, а дочерний существует, выполняется запрос на удаление родительского объекта, но не для дочерних. По сути, я бы хотел установить опцию каскадирования «save-update-orphan», но это не поддерживается.

    <set name="children" inverse="true" cascade="all-delete-orphan" access="field">
        <key column="ParentId" />
        <one-to-many class="Parent" />
    </set>

Утилита all-delete-orphan не работает для меня, потому что она удаляет потомков автоматически при удалении родителя.

Обновление Чтобы попытаться быть более понятным ... Когда я явно удаляю дочерний элемент из коллекции родительского объекта, я хочу удалить дочерний элемент. Когда я явно удаляю родителя, я не хочу, чтобы потомки удалялись.

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Я не верю, что вы можете делать то, что вы хотите с помощью конфигурации.

Единственный вариант, который я могу придумать, - это отключить удаление сирот и вручную удалить ребенка, когда вы хотите его удалить.

NHibernate Cascades: различие между всеми, all-delete-orphans и save-update

Вот что означает каждая каскадная опция:

  • нет - не делайте никаких каскадов, пусть пользователи сами их обрабатывают.
  • save-update - когда объект сохраняется / обновляется, проверяйте ассоциации и сохраняйте / обновляйте любой объект, который требует его (включая сохранить / обновить сопоставления в сценарии "многие ко многим".
  • удалить - когда объект удаляется, удаляются все объекты в ассоциации.
  • delete-orphan - при удалении объекта удаляются все объекты в ассоциации. В дополнение к этому, когда объект удаляется от ассоциации и не связан с другим объектом (осиротевший), также удалите его.
  • все - когда объект сохраняется / обновляется / удаляется, проверьте соответствие и сохраните / обновите / удалите все найденные объекты.
  • all-delete-orphan - когда объект сохраняется / обновляется / удаляется, проверяйте ассоциации и сохраняйте / обновляйте / удаляйте все найденные объекты. В в дополнение к этому, когда объект удаляется из ассоциации и не связан с другим объектом (осиротевшим), также удалите его.
0 голосов
/ 26 декабря 2011

Ну, вы должны удалить дочерний объект, если это тот, который вы хотите удалить.То есть не пытайтесь удалить потомка через родителя, если вы не хотите, чтобы родитель удалялся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...