我用NHibernate
删除如下对象:
var obj = session.Get<MyModel>(some_guid);
session.Delete(obj);
对象现在是暂时性的,并且MyModel
ID 为some_guid
的对象NHibernate
会话中标记为已删除的对象。
稍后在我的旧版应用程序中,我需要取消删除会话中删除的某些对象。我尝试了下面的解决方法,但没有运气:
var e = ((SessionImpl)session).PersistenceContext.EntityEntries;
var allEntities = e.Keys.Cast<object>().ToList();
var item = allEntities.FirstOrDefault(c => c.Id == some_guid);
session.Refresh(item); // throw an exception
上述解决方法将引发异常nhibernate instance was not in a valid state
实体删除记录在操作队列中,只能通过清除整个会话(ISession.Clear
(来取消。
你无法实现你正在寻找的东西。NHibernate不支持您的方案,取消会话中的某些挂起更改,但不能取消其他更改。
您可以尝试ISession.Evict
,但这会导致Flush
失败,因为操作队列随后必须对会话持久性上下文中缺少的实体进行操作。(它会产生一个异常,猜测已尝试线程使用,但好吧,不,只是对具有挂起操作的实体的Evict
。
您必须更改应用程序以避免它删除首先不应删除的对象。
或者,当检测到不应删除会话中删除的某些对象时,请取消整个会话(回滚事务、释放会话、使用新会话(,然后重做工作而不删除必须保留在那里的对象。(如果不使用事务,FlushMode.Auto
可能会在Clear
会话之前刷新删除。
或者在最坏的情况下,保留对象的副本,提交会话,然后重新保存它们......