Я пытаюсь устранить неисправность кода, пытающегося обновить отключенную сущность, имеющую неинициализированные ссылки на дочерние сущности. Намерение состоит в том, чтобы обновлять только свойства родительского элемента без загрузки дочерних элементов.
HasMany(x => x.ChildEntities)
.KeyColumn("ChildEntityId")
.Table("ChildEntity")
.Not.LazyLoad()
.Inverse()
.Cascade.All().AsBag();
Когда вызывается Session.Update (parent), выполняются два оператора обновления. Первый обновляет родительский объект, как и ожидалось.
update Parent set ... where ParentId = 12345
Второе обновление меня смущает ...
update ChildEntity set ParentId = null where ParentId = 12345
Почему NHibernate выпускает этот второй оператор SQL? Я понимаю, что ChildEntities не инициализирован и что NHibernate, вероятно, пытается обеспечить состояние Parent, но я не могу изменить отображение, чтобы не сделать это второе обновление. Я пробовал Merge, ленивую загрузку, различные варианты каскада и т. Д., Но безуспешно. Единственный подключенный объект в сеансе, когда он пытается зафиксировать это Parent.
Обратите внимание, что я обычно подхожу к этому, извлекая сущность с включенной отложенной загрузкой, а затем сопоставляя отсоединенный объект (DTO или сущность) с подключенной сущностью, прежде чем позволить NHibernate сохраняться в базе данных. Я хочу понять, почему вышесказанное не работает, прежде чем предложить альтернативный подход.