2017-07-09 83 views
1

还原被删除的情况下我删除类似下面的物体与NHibernateNHibernate的会议

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

的对象现在是暂时的,MyModel对象ID为some_guidNHibernate会话被标记为删除的对象。

在我的遗留应用程序之后,我需要取消一些对象删除在会话中删除。我想下面的解决方法,但没有运气:

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

的实体删除被记录在这只能通过清除整个会议被取消一个动作队列(ISession.Clear) 。

你无法实现你正在寻找的东西。 NHibernate不支持你的场景,取消会话中的一些未决更改,但不是其他人。

您可能已尝试ISession.Evict,但在Flush上导致失败,因为操作队列随后会对会话持久性上下文中缺少的实体起作用。 (它会产生一个异常,猜测线程用法已被尝试,但是,不,只是一个具有未决操作的实体上的Evict)。

您必须更改应用程序以避免删除不应删除的对象第一个地方。

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

或者在最坏的情况,让你的对象的副本,提交了会议,并重新保存它们...