NHibernate идентификатор измененного исключения - PullRequest
4 голосов
/ 08 января 2010

Я пытаюсь импортировать некоторые большие файлы, используя пакетные запросы и обработку паралелей, и постоянно получаю сообщения об ошибках типа

NHibernate.HibernateException: identifier of an instance of xxx was altered from ... to ...

Я знаю, что вообще не изменяю свой первичный ключ. Я использую NH 2.1.x GA, ThreadStaticSessionContext, каждый файл обрабатывается в отдельном потоке (используя ThreadPool) и информация в файлах не связана. У меня есть сеанс и транзакция для каждого файла, но я вообще не очищаю сеанс. В том же потоке я совершаю транзакцию и закрываю сеанс, но эта ошибка выводит меня из себя.

Если у вас есть предложения ...

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

В моем случае у меня было другое решение той же проблемы. Ошибка, которую я увидел, была следующей:

NHibernate.HibernateException: идентификатор экземпляра XXXX был изменено с 9 на 9

Проблема заключалась в том, что я изменил идентификатор (столбец «id») в XML-файле сопоставления с «Int64» на «Int32», но забыл переключить класс данных с Int64 на Int32. Это объясняет тот факт, что NHibernate не мог изменить идентификатор «9» с «9». Первая «9» была Int64, но ожидала «Int32». Я надеюсь, что это помогает кому-то.

1 голос
/ 09 января 2010
  1. Установите свой идентификатор в:

    public int ID {get; приватный набор; }

    чтобы вы не могли его изменить.

  2. Проверьте, совпадает ли тип идентификатора с типом в базе данных. (если в базе данных есть поле int и вы устанавливаете его в длинное поле, то nHibernate считает, что оно изменилось.

  3. Если вы используете идентификатор для PK, измените его на Hi-Lo или что-то еще. Было много разговоров о том, чтобы не использовать идентичность в SQL Server. В некоторых случаях это может не сработать.

0 голосов
/ 25 января 2010

Просто, чтобы закрыть это, я считаю, что ошибка произошла из-за плохих навыков кодирования (использование общих ресурсов, охватывающих несколько потоков без заботы о параллелизме) и идентичности первичных ключей.

В коде не было места, где я сам устанавливал или изменял значения первичного ключа.

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