NHibernate Cascade = сохранить-обновить "? - PullRequest
12 голосов
/ 20 июля 2009

Отказ от ответственности: я - новичок NHibernate, так что, надеюсь, этот вопрос имеет смысл. У меня есть отношения многие ко многим между двумя классами, что-то вроде ...

public class Entity1
{
    public virtual Guid EntityId { get; set; }
    public virtual IList<Entity2> Entity2List;
} 

Public class Entity2
{
    public virtual Guid EntityId { get; set; }
    public virtual IList<Entity1> Entity1List;
}

Я добавил отношение «многие ко многим» с сумкой в ​​оба отображения классов, определяя таблицу ассоциации, но не уверен, какой каскадный вариант использовать. Я хочу иметь возможность создать новый экземпляр Entity1, добавить новый экземпляр Entity2 в свой список, вызвать Save, и оба будут вставлены в базу данных (и наоборот). При удалении объекта он должен удалять любые ассоциации с дочерними объектами, но не сам дочерний объект. Должен ли я использовать cascade = "save-update"?

1 Ответ

26 голосов
/ 20 июля 2009

Да. Похоже, в данном случае вам нужно «сохранить-обновить».

Я никогда не находил отличного объяснения каждого каскадного варианта в документации, но использовал это сообщение в блоге Ayende в качестве ссылки.

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