在 NHibernate 会话中还原已删除的实例



我用NHibernate删除如下对象:

var obj = session.Get<MyModel>(some_guid);
session.Delete(obj);

对象现在是暂时性的,并且MyModelID 为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会话之前刷新删除。

或者在最坏的情况下,保留对象的副本,提交会话,然后重新保存它们......

最新更新