Nhibernate 保存被其他会话删除的实体时发生StaleStateException(并发)

Nhibernate 保存被其他会话删除的实体时发生StaleStateException(并发),nhibernate,concurrency,Nhibernate,Concurrency,我正在使用NHibernate访问数据层。 我在内存中有一个以前加载过的实体,我正在进行更改以便在数据库上保存。当我的应用程序同时在一些机器上运行,而其他用户从数据库中删除了我内存中要保存的同一对象时,就会出现问题。当我尝试保存更改或删除此实体时,将在中触发StaleStateException 我检查调用会话的数据库中是否存在实体。通过这种方式获取(成功获取空值): 使用(var session=NHibernateSessionHelper.OpenSession()) { 使用(var t

我正在使用NHibernate访问数据层。 我在内存中有一个以前加载过的实体,我正在进行更改以便在数据库上保存。当我的应用程序同时在一些机器上运行,而其他用户从数据库中删除了我内存中要保存的同一对象时,就会出现问题。当我尝试保存更改或删除此实体时,将在中触发StaleStateException

我检查调用会话的数据库中是否存在实体。通过这种方式获取(成功获取空值):

使用(var session=NHibernateSessionHelper.OpenSession())
{
使用(var transaction=session.BeginTransaction())
{
var entity=session.Get(persistObject.Id);
返回实体==null?false:true;
}
}
当我无法区分实体何时被其他会话/用户删除(因此我在内存中的实体已过时)或实体最近创建并能够保存时,就会出现问题。 我认为唯一的解决方案是实现一种机制来检查实体是否已经从数据库中保存或加载,以便在继续操作时丢弃实体或保存

有没有办法用nhibernate检查这种行为?我尝试了
session.Refresh()和session.Get
,但我仍然不知道对象是新的,准备保存还是过时


非常感谢您的帮助。

您遇到的情况是典型的错误处理。因为一个用户已经决定删除数据库中的一个对象,而另一个用户想要保存对同一对象的更改,所以您不能说正确的状态应该是什么。用户应该决定如何应对这种情况。你可以给他一些选择,让你的错误处理变得更聪明。对于有多个用户向同一对象写入数据的情况,还应该实现类似于meganism的乐观锁定,以防止其他用户覆盖他没有看到的更改。如果您有许多这样的情况,您应该考虑重新设计数据库/对象结构,一次编辑更少的数据,或者重新考虑用户对系统所做的工作/流程。

您遇到的情况是典型的错误处理情况。因为一个用户已经决定删除数据库中的一个对象,而另一个用户想要保存对同一对象的更改,所以您不能说正确的状态应该是什么。用户应该决定如何应对这种情况。你可以给他一些选择,让你的错误处理变得更聪明。对于有多个用户向同一对象写入数据的情况,还应该实现类似于meganism的乐观锁定,以防止其他用户覆盖他没有看到的更改。如果你有很多这样的情况,你应该考虑重新设计你的db/对象结构,一次编辑更少的数据,或者重新考虑你的用户对系统所做的工作/流程。

是的,我同意你的意见(这是我的初步意见),但我不知道NHibernate中是否有任何机制可以证明实体是否过时。我有一个变通办法,在实体中创建一个布尔属性,指示是由用户创建的(创建新元素)还是由Nhibernate填充的。是的,我同意你的意见(这是我的初步意见),但我不知道Nhibernate中是否有任何机制可以获取实体是否过时。我有一个解决办法,在实体中创建一个布尔属性,指示是由用户创建(创建新元素)还是由Nhibernate填充。
using (var session = NHibernateSessionHelper.OpenSession())
{
   using (var transaction = session.BeginTransaction())
   {
       var entity = session.Get<T>(persistObject.Id);
       return entity == null ? false : true;
   }
}