Есть два класса, один имеет ссылку на коллекцию экземпляров другого (IList
). Этот граф сохраняется в базе с помощью HNibernate. Как задать правила, определяющие, что должно происходить с дочерними объектами, при операциях с родительскими (добавление, удаление, обновление/create, delete, update)?
Как задавать правила каскадирования в NHibernate?
Лучший ответ:
Правила каскадирования задаются атрибутом cascade
в конфигуровочном файле. Возможные варианты cascade:
none — не использовать никаких автоматических правил, в этом случае ответственность за целостность данных лежит на пользователе и движке БД.
save-update — когда объект сохраняется или обновляется, проверяются и создаются/обновляются все зависимые объекты (если это необходимо).
delete — при удалении объекта удаляются все ассоциированные с ним объекты.
delete-orphans - при удалении объекта удаляются все ассоциированные с ним объекты. В дополнение к этому, когда дочерний объект A
удаляется из списка ассоциированных объектов родителя B
(B.ListOfA.Remove(A)
) и не назначается другому родителю (так называемый orphaned объект), то A
также удаляется вместе с B
.
all — когда объект сохраняется, обновляется или удаляется, проверяются и создаются/обновляются/добавляются все зависимые объекты (если это необходимо). Аналогично совместному применению правил delete
и save-update
.
all-delete-orphans - когда объект сохраняется, обновляется или удаляется, проверяются и создаются/обновляются/добавляются все зависимые объекты (аналогично all
). В дополнение к этому, когда дочерний объект A
удаляется из списка ассоциированных объектов родителя B
(B.ListOfA.Remove(A)
) и не назначается другому родителю, то A
также удаляется вместе с B
.
Внимание! В разных версиях NHibernate может использоваться разное написание слова orphans (orphans или orphan). Если получаете исключение типа
Unsupported cascade style: delete-orphans
то это ваш случай.