2013-03-15 92 views
1

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

我检查,如果数据库调用的这种方式session.Get<T>存在的实体(it's得到一个空成功地):

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>,但我仍然不知道对象是否是新的,并准备保存或过时。

非常感谢。

回答

1

您所处的位置是处理错误的一个错误。由于用户已决定删除数据库中的对象,并且其他用户希望将更改保存到同一对象,所以您无法说出正确的状态应该是什么。用户是应该自杀的人如何处理情况。通过给他一些选择,你可以让你的错误处理更加智能。对于有多个用户写入同一个对象的情况,您还应该实施乐观锁定等机制,以防止其他用户覆盖他没有看到的更改。如果你有很多这样的情况,你应该考虑重新设计你的数据库/对象结构来一次编辑更少的数据,或者重新考虑你的用户在系统中做的工作/处理。

+0

是的,我同意你的意见(是我的初步意见),但我不知道NHibernate中是否有任何机制来获取实体是否过时。我有一个解决方法,在实体中创建一个布尔属性,指明是否已由用户创建(创建新元素)或由Nhibernate填充。 – Carlos 2013-03-15 12:37:37

相关问题