我使用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
答案 0 :(得分:0)
实体删除记录在一个动作队列中,只能通过清除整个会话(ISession.Clear
)来取消。
你无法实现你想要的。 NHibernate不支持您的方案,取消会话中的某些挂起更改,但不取消其他更改。
您可能已尝试ISession.Evict
,但这会导致Flush
失败,因为操作队列必须对会话持久性上下文中缺失的实体执行操作。 (它产生了一个异常,猜测线程使用已被尝试但是,不,只是对具有待处理操作的实体的Evict
。)
您必须更改应用程序,以避免删除首先不应删除的对象。
或者,当检测到会话中删除的某些对象不应被删除时,取消整个会话(回滚事务,处理会话,使用新会话),并重做工作而不删除必须保留在那里的对象。 (如果您不使用交易,FlushMode.Auto
可能会在您Clear
会话之前刷新删除。)
或者最坏的情况是,保留对象的副本,提交会话并重新保存...