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