我使用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>
,但我仍然不知道对象是否是新的,并准备保存或过时。
非常感谢。
是的,我同意你的意见(是我的初步意见),但我不知道NHibernate中是否有任何机制来获取实体是否过时。我有一个解决方法,在实体中创建一个布尔属性,指明是否已由用户创建(创建新元素)或由Nhibernate填充。 – Carlos 2013-03-15 12:37:37