Исключение NHibernate: нет снимка коллекции для удаления сирот - PullRequest
0 голосов
/ 08 июня 2009

У меня проблема с NHibernate, когда я пытаюсь сохранить сущность, у которой есть коллекция других сущностей.

Пример, Order и OrderLine. OrderLine связан с заказом с сумкой. Его каскад установлен на Delete-Orphan, и когда я вызываю SaveOrUpdate для ордера, я вызываю SaveOrUpdate для его OrderLines.

Исключение возникает в SaveOrUpdate ордена, но только если коллекция моего OrderLine не равна нулю.

Перед тем как установить каскад "delete-orphan", у меня было "all-delete-orphan", и я подумал, что могу использовать SaveOrUpdate OrderLine для NHibernate. Проблема состоит в том, что каждая OrderLine имеет номер, который должен быть уникальным. Если я удаляю OrderLine с Number = 2 и добавляю новую OrderLine с Number = 2, при попытке повторного сохранения будет возникать исключение, потому что NHibernate вставляет и обновляет новые реестры перед удалением старых сирот.

Из-за этого я подумал, что при сохранении моего объекта Order (у которого NumberLine, OrderLine был удален из коллекции) будет удалена эта OrderLine, а затем вызов SaveOrUpdate для текущих OrderLines сохранит их правильно без нарушений уникального ключа.

Оказывается, это не так, потому что я получаю исключение при сохранении самого заказа.

Любая помощь будет принята с благодарностью. Спасибо

Ответы [ 2 ]

0 голосов
/ 08 июня 2009

спасибо за ваш ответ.

Выдается исключение «Нет снимка коллекции ..», даже если я создаю новый Order, добавляю новые OrderLines в коллекцию и вызываю SaveOrUpdate для объекта Order. Это даже не требует сброса или фиксации, чтобы бросить исключение. Это в вызове SaveOrUpdate. Это не связано с уникальным ограничением для OrderLine.Number.

Во всяком случае, решение, которое я придумал, это:

  • Отобразить сумку OrderLines с помощью cascade = "all-delete-orphan" (используя OrderLines сохраняет / обновляет / удаляет)
  • Удалить уникальное ограничение для OrderLine.Number в базе данных.
  • Используйте утверждение в методе SaveOrUpdate моего класса OrderRepository (я использую SharpArchitecture), чтобы убедиться, что я никогда не сохраню ордер, в котором есть две или более строки ордеров с одинаковым номером.

Мне не нравится это решение ... но пока оно работает.

Мне бы хотелось услышать еще несколько мыслей по этому поводу и о том, как люди часто решают эту проблему с помощью NHibernate (Order with OrderLines и сумка отображается с помощью cascade = "all-delete-orphan")

0 голосов
/ 08 июня 2009

Я думаю, что вы столкнулись с проблемой порядка операций с сессиями NHibernate. NHibernate всегда вставляет первым и удаляет последним. Единственное решение, которое приходит на ум, это очистить сеанс между удалением и добавлением элементов в коллекцию. Ваш процесс может выглядеть примерно так:

var session = factory.OpenSession();
var tx = session.BeginTransaction();

order.Lines.Remove(line);

// Write out the SQL up to this point, inside the transaction
session.Flush();

order.Lines.Add(new OrderLine(...));

tx.Commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...