Перемещение объекта к другому родителю с помощью NHibernate дает ошибку нарушения уникального ключа - PullRequest
0 голосов
/ 25 июля 2011

Я использую NHibernate в своем проекте.Я просто подумал получить от вас информацию.Проблема, с которой я сталкиваюсь, заключается в следующем:

У меня есть три таблицы БД, которые связаны между собой.Соотношение показано ниже

  • Table1 (Field1_PK, Other_fields)
  • Table2 (Field1_PK, Field2_FK_To_Table1_PK, Other_Fields)
  • Table3 (Field1_PK, Field2_FK_Po_Table) 2)

Table3 -> Table2 -> Table1

У меня есть отдельные файлы сопоставления NH для этих трех объектов.Отношения между этими таблицами отображаются в файлах с использованием тегов.Каскад = "all-delete-orphan" также указан.Теперь я пытаюсь переместить одну запись в Таблице 3 в другую запись в Таблице 2, которая еще не существует, и, в свою очередь, необходимо перейти к другой записи в Таблице 1.Таким образом, в идеале в качестве одной транзакции следующие шаги должны выполняться в указанном порядке: 1. Удалить запись из Таблицы3 2. Удалить старую запись из Таблицы2 3. Удалить старую запись из Таблицы1 4. Создать новую запись в Таблице1 5. Создать новуюзапись в таблице 2 6. Создать новую запись в таблице 3

. Для этого я получил объект записи таблицы 3 и изменил его свойство, чтобы связать его с новым объектом записи таблицы 2.

К сожалению,Я получаю ошибку нарушения уникального ключа, которая генерируется на основе уникального ключа Table3.Причина в том, что step6 (INSERT) происходит первым.Поскольку в таблице уже есть запись с тем же ключом, она выдает ошибку.Я удалил индекс уникального ключа из таблицы и обнаружил, что функциональность работает нормально, но сначала выполняется тот же шаг6.Но в целом функционал работает нормально.Но у меня должен быть уникальный индекс ключа в таблице.

Пожалуйста, напишите свои комментарии, если у вас есть идеи по этому поводу!

Даниэль

1 Ответ

0 голосов
/ 25 июля 2011

Это из nhib doc и показывает порядок выполнения:

Операторы SQL выдаются в следующем порядке

  1. все вставки сущностей, в том же порядке соответствующие объекты былисохранено с помощью ISession.Save ()
  2. все обновления сущностей
  3. все удаления коллекций
  4. все удаления, обновления и вставки элементов коллекции
  5. все вставки коллекции
  6. все удаления сущностей, в том же порядке соответствующие объекты были удалены с помощью ISession.Delete ()

Итак, самый простой способ решить вашу проблему - это явный вызов session.Flush ()сразу после удаления объекта.

Принудительный NHibernate для каскадного удаления перед вставками

https://groups.google.com/forum/#!topic/nhusers/GBGbdrzakzw

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