在 NHibernate 会话中恢复已删除的实例
Revert a deleted instance in NHibernate session
我使用 NHibernate
删除如下对象:
var obj = session.Get<MyModel>(some_guid);
session.Delete(obj);
该对象现在是临时对象,ID 为 some_guid
的 MyModel
对象在 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
会话之前刷新删除。)
或者在最坏的情况下,保留对象的副本,提交会话,然后重新保存它们...
我使用 NHibernate
删除如下对象:
var obj = session.Get<MyModel>(some_guid);
session.Delete(obj);
该对象现在是临时对象,ID 为 some_guid
的 MyModel
对象在 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
会话之前刷新删除。)
或者在最坏的情况下,保留对象的副本,提交会话,然后重新保存它们...