что означает эта ошибка в nhibernate - PullRequest
21 голосов
/ 10 декабря 2010

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

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

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

Некоторая дополнительная информация

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

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

Ответы [ 6 ]

23 голосов
/ 10 декабря 2010

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

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

13 голосов
/ 10 декабря 2010

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

6 голосов
/ 09 июня 2011

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

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

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

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

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

1 голос
/ 14 апреля 2015

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

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

0 голосов
/ 22 августа 2018

Если у вас есть триггер на столе, это может быть причиной. В этом случае добавьте внутрь

SET ROWCOUNT 0; SET NOCOUNT ON;

0 голосов
/ 04 декабря 2014

Моя проблема была такой:

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

Должно было быть:

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

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

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