2012-06-13 58 views
0

我有一个NHibernate对象,它有一个子集合映射为AsBag,反向,Cascade.AllDeleteOrphan。NHibernate坚持以前的'删除'对象

我有我需要重新保留已删除对象的场景。

删除父对象是没问题的..父母和孩子从数据库中删除。

问题是,我需要重新保存/保留已删除的对象。如果我尝试调用SaveUpdate,则会得到StaleObjectStateException,因为对于父对象和子对象,Id字段仍设置为非零值。

当然,我可以强制Id为零父母删除,但然后迫使孩子们的ID为零看起来很麻烦。

有没有更好的策略来处理?

非常感谢

回答

0

如果Evict后你Delete,但在此之前你Flush,你会没事的;它会滚下您的待处理删除。

 // Act 
     using (ISession session = _factory.OpenSession()) 
     using (ITransaction tx = session.BeginTransaction()) 
     { 
      session.Save(expected); 
      session.Flush(); 

      session.Delete(expected); 
      session.Evict(expected); 

      tx.Commit(); 
     } 

     using (ISession session = _factory.OpenSession()) 
     using (ITransaction tx = session.BeginTransaction()) 
     { 
      actual = session.Get<Person>(expected.Id); 

      var count = actual.Roles.Count; 
     } 

     // Assert 
     expected.ShouldHave().AllProperties().EqualTo(actual); // succeeds; record is not deleted or otherwise molested. 

但是,一旦你刷新,没有一种好的方法来撤消/重新保存。找出如何避免首先删除对象,避免在删除和恢复之间进行刷新,或者回滚事务以撤销删除。另一种选择是,如果数据可以重新保存为新记录(只要值保留),那么只需克隆已删除的记录并保存即可。

+0

感谢您的快速反应,但在这种情况下,它将无法正常工作....我真的需要一种机制,我可以删除并重新保留一个对象图。 我们所做的是: a。用一个方法创建一个接口ResetId,它被添加到每个像这样的对象。 b。挂钩到PostCommitDeleteEventListeners事件中,如果对象实现了我们称之为ResetId的接口。 您是否预见到了这种方法的任何问题? 非常感谢 –

+0

期望的最终结果是什么?将删除的图像保存为新品牌? – HackedByChinese

+0

在这种情况下,是的,当它被删除时,可能需要重新保留;这种类型的“交易”也会涉及多个会话(它位于Web应用程序中)。顺便说一下,这不是'长时间运行'的交易。 –