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

时间:2017-07-09 06:35:11

标签: hibernate nhibernate fluent-nhibernate

我使用NHibernate删除了下面的对象:

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

该对象现在是暂时的,MyModel会话中标记为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

1 个答案:

答案 0 :(得分:0)

实体删除记录在一个动作队列中,只能通过清除整个会话(ISession.Clear)来取消。

你无法实现你想要的。 NHibernate不支持您的方案,取消会话中的某些挂起更改,但不取消其他更改。

您可能已尝试ISession.Evict,但这会导致Flush失败,因为操作队列必须对会话持久性上下文中缺失的实体执行操作。 (它产生了一个异常,猜测线程使用已被尝试但是,不,只是对具有待处理操作的实体的Evict。)

您必须更改应用程序,以避免删除首先不应删除的对象。

或者,当检测到会话中删除的某些对象不应被删除时,取消整个会话(回滚事务,处理会话,使用新会话),并重做工作而不删除必须保留在那里的对象。 (如果您不使用交易,FlushMode.Auto可能会在您Clear会话之前刷新删除。)

或者最坏的情况是,保留对象的副本,提交会话并重新保存...