在 NHibernate 会话中恢复已删除的实例

Revert a deleted instance in NHibernate session

我使用 NHibernate 删除如下对象:

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

该对象现在是临时对象,ID 为 some_guidMyModel 对象在 NHibernate 会话中被标记为已删除对象。

稍后在我的旧版应用程序中,我需要取消删除一些objects 在会话中删除。我尝试了下面的解决方法,但没有成功:

 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。)

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

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

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