1

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

我以这种方式检查数据库调用中是否存在实体session.Get<T>(它成功获得空值):

using (var session = NHibernateSessionHelper.OpenSession())
{
   using (var transaction = session.BeginTransaction())
   {
       var entity = session.Get<T>(persistObject.Id);
       return entity == null ? false : true;
   }
}

当我无法区分实体已被其他会话/用户删除(因此我在内存中的实体已过时)或实体最近创建并能够保存时,问题就出现了。我认为唯一的解决方案是实施一种机制来检查实体是否已经从数据库中保存或加载,以便在继续时丢弃实体或保存。

有没有办法通过使用 nhibernate 来检查这种行为?我试过了,session.Refresh() and session.Get<T>但我仍然不知道该对象是新的并且准备好保存还是过时。

非常感谢帮助。

4

1 回答 1

1

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

于 2013-03-15T08:28:13.883 回答