четверг, 19 июля 2012 г.

NHibernate каскады: разница между all, all-delete-orphans, save-update

Понадобилось разобраться с ORM, и так как пишу на C# выбрал для себя NHibernate в связке с xml-less оберткой Fluent NHibernate.
До этого с ORM я не работал, да и о СУБД в целом знал только в теории.
Данный пост - это частичный перевод вот этой записи, и создается прежде всего для таких же как я новичков, чтобы лучше понять и запомнить разницу между опциями каскадирования.

Что такое NHibernate каскады:
Каждая сущность может быть связана с другой сущностью (связь много к одному) или с коллекцией сущностей (связи один ко многим и множество ко множеству). При любом виде связи вы можете указать NHibernate автоматически обновлять участников связи, в соответствии с настройками каскадирования.
Например, вы можете добавить новый элемент в коллекцию элементов сущности, и если в настройках каскадирования выбран режим save-update, то при сохранение сущности также будет сохранен новый элемент, без каких-либо специальных действий. Удобно, не правда ли?
Ниже представлено описание всех доступных опций каскадирования:
  • none - не выполнять никакого каскадирования. Пользователь сам отвечает за порядок редактирования объектов.
  • save-update - после сохранения\обновления объекта также проверить связи объекта с другими сущностями и при необходимости обновить\сохранить их, в том числе при связи многие ко многим.
  • delete - во время удаления объекта также удалить все ассоциированные объекты.
  • delete-orphan -  во время удаления объекта также удалить все ассоциированные объекты. В дополнение к этому, если после удаления ассоциированного объекта, объект "осиротел" (">orphaned) т.е. не имеет связи с другими объектами, то также удалить его.
  • all - когда объект сохраняется/обновляется/удаляется обновляются/удаляются/сохраняются ассоциированные объекты.
  • all-delete-orphan - когда объект сохраняется/обновляется/удаляется обновляются/удаляются/сохраняются ассоциированные объекты. В дополнение к этому, если после удаления ассоциированного объекта, объект "осиротел"(orphaned) т.е. не имеет связи с другими объектами, то также удалить его.
Таким образом, если у Вас есть связь Родитель-Потомок, и потомок может существовать без родителя, то необходимо выбирать опцию save-update, для того чтобы удаление родителя не приводило к удалению потомка, как в случае опции all-delete-orphan.

Комментариев нет:

Отправить комментарий