Подтвердить что ты не робот

Что означает эта ошибка в nhibernate

Синим цветом я получаю эту ошибку при выполнении ряда обновлений с помощью nhibernate.

Строка была обновлена ​​или удалена другой транзакцией (или неверно было отображено несохраненное значение): [MyDomainObject]

в ошибке нет дополнительной информации. Есть ли рекомендуемый способ помочь определить проблему с корнем, или кто-то может дать мне лучшее объяснение того, что эта ошибка указала или является симптомом.

Дополнительная информация

Я посмотрел на объект, и все данные выглядят отлично, у него есть идентификатор и т.д..

Обратите внимание, что это выполняется в одном стеке вызовов с веб-сайта asp.net-mvc, поэтому я не ожидал, что возникнут какие-либо проблемы с потоками, которые могут беспокоиться о concurrency.

4b9b3361

Ответ 1

Это означает, что у вас есть несколько транзакций, обращающихся к тем же данным, что приводит к возникновению проблем concurrency. Вы должны улучшить обработку данных, вы, вероятно, обновляете данные из нескольких потоков, сначала объединяете измененные данные в очередь, которая обрабатывает весь доступ к db.

Ответ 2

NHibernate имеет объект, назовем его theObject. theObject.Id имеет значение 42. NHibernate замечает, что объект грязный. Идентификатор объекта отличается от несохраненного значения, которое равно нулю (0) для целых первичных ключей. Поэтому NHibernate выдает инструкцию update, но ни одна строка не обновляется, а это означает, что в базе данных для этого типа объекта нет строки с Id из 42. Таким образом, объект был удален без NHibernate, зная об этом. Это может произойти внутри другой транзакции (например, у вас есть проблемы с потоками), или если кто-то (или другое приложение) удалил/изменил строку, используя SQL, непосредственно к базе данных.

Другая возможность заключается в том, что ваша несохраненная ценность неверна. например Вы используете -1 для указания несохраненного объекта, но ваше сопоставление имеет несохраненное значение нуля. Это маловероятно, так как ваше приложение обычно работает со звуками. Если несохраненная ценность была неправильной, вы не смогли бы сохранить какие-либо объекты в базе данных, поскольку NHibernate выдавал бы инструкции UPDATE, когда он должен был выпускать INSERT.

Ответ 3

Старый пост, но, надеюсь, моя информация поможет кому-то. Я получал подобную ошибку, но только когда сохраняются ассоциации после добавления в новый объект. Ошибка имела вид:

NHibernate.StaleObjectStateException: строка была обновлена ​​или удалена другой транзакцией (или неверное сопоставление значений) [My.Entity # 0]

Обратите внимание на ноль в конце, который является моим свойством идентификатора. Он не должен пытаться сохранить ключ с нулевым значением, поскольку я использовал спецификацию идентификации в SQL Server (генератор class= native). Я не изменил свою несохраненную ценность в моем xml, поэтому я понятия не имел, в чем проблема; по какой-то причине NHibernate пытался сделать обновление с использованием значения ключа как 0 вместо сохранения (и получения следующего идентификатора ключа) для моего нового объекта.

В конце концов я обнаружил, что причина в том, что я инициализировал номер версии 1 для нового объекта в моем конструкторе! Хотя мое свойство идентификатора было нулевым, по какой-то причине NHibernate также искал свойство версии, равное нулю, чтобы идентифицировать его как несохраненный экземпляр переходного процесса. В книге "NHibernate in Action" действительно упоминается об этом на стр. 120, но по какой-то причине мои объекты были хорошими при сохранении с номером версии 1 в обычном режиме и только сбой при сохранении нового объекта через ассоциацию.

Поэтому убедитесь, что вы не установили значение своей версии (оставьте как ноль или нуль).

Ответ 4

Моя проблема заключалась в следующем:

[Bind(Include="Name")] EventType eventType

Должно быть:

[Bind(Include="EventTypeId,Name")] EventType eventType

Как и другие ответы, nhibernate использует нуль в качестве идентификатора для моего объекта.

Ответ 5

Вы говорите, что ваши данные в порядке, но проверьте, если, например, вы сопоставляете идентификатор как self generate. У меня была такая же проблема, но я отправлял объект с идентификатором, отличным от 0.

Надеюсь, что это поможет!