2012-06-13 54 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應用程序中)。順便說一下,這不是'長時間運行'的交易。 –