Ситуация
Предполагать:
- NHibernate 4
- Отношения родитель / потомок (один ко многим), однонаправленное отображение от родителя к потомку
Inverse(false)
, т.е. родитель отвечает за ассоциациюCascade.All
от родителя к ребенку- Контроль версий (столбец базы данных, который автоматически увеличивается в БД при обновлении записи) включен как для родительского, так и для дочернего элементов (оптимистическая блокировка)
Наблюдаемое поведение:
- Открытая сессия и транзакция.
- Загрузите родительский объект вместе с его дочерней коллекцией через некоторый запрос.
- Добавьте вновь созданный дочерний элемент в дочернюю коллекцию.
SaveOrUpdate
родитель.- NHibernate сначала добавляет дочерний элемент в базу данных, давая ему версию.
- Затем он заботится о родительской ассоциации (потому что он отвечает за нее) и обновляет внешний ключ дочернего элемента (слава богу, он допускает значение NULL ...), увеличивая версию дочернего элемента. Однако он не обновляет дочерний элемент в сеансе.
- Наконец, он применяет каскадирование, а также вызывает
AddOrUpdate
для дочернего элемента. Единственная проблема: в сеансе есть устаревшая версия, из-за которой выдаетсяConcurrencyException
. NHibernate стреляет себе в ногу.
Вопрос
Почему NHibernate не обновляет дочерние объекты в сеансе, когда применяет логику для обновления ассоциации? Что за этим стоит? Мне кажется, что единственный разумный способ смоделировать родитель / потомок с контролем версий - это использовать Inverse(true)
.
Уточнение: меня не интересуют какие-либо обходные пути и / или более подходящая конфигурация. Я знаю о них. Меня интересуют только причины поведения NHibernate в описанном сценарии.
Изменить: основная проблема, похоже (imo), что NHibernate не полностью контролирует управление версиями самостоятельно. Скорее, пусть об этом позаботится база данных (по крайней мере, в моей конфигурации). К сожалению, это не очень хорошо работает вместе, потому что NHibernate не ожидает изменения версии в клиенте, когда он обновляет ассоциацию с ним, потому что с более высокого уровня ассоциация принадлежит родителю и, следовательно, никаких изменений в дочернем элементе не происходит. ожидал. Это, по крайней мере, возможное объяснение этого.