这个错误在nhibernate中意味着什么

时间:2010-12-09 23:54:26

标签: nhibernate fluent-nhibernate

突然之间,我在使用nhibernate进行大量更新时遇到此错误。

行被另一个事务更新或删除(或未保存的值映射不正确):[MyDomainObject]

错误中没有其他信息。是否有一些建议的方法来帮助确定根本问题,或者有人能给我一个更好的解释,说明这个错误表明的是什么或是一个sympton周围。

一些其他信息

我查看了对象,所有数据看起来都很好,它有ID等。

请注意,这是在asp.net-mvc网站的单个调用堆栈中运行,因此我不希望在并发性方面存在任何线程问题。

5 个答案:

答案 0 :(得分:22)

NHibernate有一个对象,我们称之为theObjecttheObject.Id的值为42。 NHibernate注意到该对象很脏。对象的Id与unsaved-value不同,对于整数主键,该值为零(0)。因此NHibernate发出更新语句,但没有更新行,这意味着数据库中没有Id 42的{​​{1}}对象类型的行。因此,在没有NHibernate知道的情况下删除了该对象。这可能发生在另一个事务中(例如,您有线程问题),或者某人(或其他应用程序)使用SQL直接删除/更改了该行。

另一种可能性是你的未保存值是错误的。例如您正在使用-1来指示未保存的实体,但您的映射的未保存值为零。这是不太可能的,因为您的应用程序通常是从它的声音工作。如果未保存的值是错误的,那么您将无法将任何实体保存到数据库,因为NHibernate在发出UPDATE时应该发出INSERT语句。

答案 1 :(得分:13)

这意味着您有多个事务访问相同的数据,从而产生并发问题。您应该改进数据访问处理,您可能正在从多个线程更新数据,首先将更改的数据联合到一个队列中,该队列处理对数据库的所有访问。

答案 2 :(得分:5)

旧帖子,但希望我的信息可以帮助某人。我添加了一个新对象后,我得到了一个类似的错误,但只有在持久关联时。错误的形式如下:

NHibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确)[My.Entity#0]

注意结尾的零,这是我的标识符属性。当我在SQL Server中使用身份规范(生成器类=本机)时,它不应该尝试使用密钥零进行保存。我没有在我的xml中更改未保存的值,所以我不知道问题是什么;出于某种原因,NHibernate试图使用键值作为0进行更新而不是为我的新对象保存(并获得下一个键标识)。

最后我发现原因是我在构造函数中为新对象初始化版本号为1!即使我的标识符属性为零,由于某种原因,NHibernate也在寻找零版本属性,以将其标识为未保存的瞬态实例。书中的“NHibernate in Action”确实在第120页提到了这一点,但由于某些原因,当正常版本号为1时,我的对象很好,只有在通过关联保存新对象时才会失败。

因此请确保您未设置版本值(保留为零或空)。

答案 3 :(得分:0)

我的问题是:

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

应该是:

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

正如其他答案所示,nhibernate使用零作为我实体的id。

答案 4 :(得分:0)

您说您的数据没问题,但请检查您是否将ID映射为自生成。我有完全相同的问题,但我发送了一个ID不同于0的对象。

希望它有所帮助!