2011-01-11 73 views
1

這裏是我的測試用例:NHibernate的:保存,刪除然後保存同一實體拋出StaleStateException

[Test, Explicit] 
public void SaveDeleteSaveThrowsTest() 
{ 
    Produit produit = new Produit { Libelle = "Test" }; 

    using (ISession session = this.SessionProvider.OpenSession()) 
    { 
     session.FlushMode = FlushMode.Auto; 

     using (ITransaction transaction = session.BeginTransaction()) 
     {      
      session.SaveOrUpdate(produit); 
      transaction.Commit(); 
     } 

     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.Delete(produit); 
      transaction.Commit(); 
     } 

     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.SaveOrUpdate(produit); 
      Assert.Throws(typeof(StaleStateException), transaction.Commit); 
     } 
    } 
} 

的ID被希洛產生。

如果我在保存它之前將實體的Id賦值爲0,它在這種簡單的情況下工作,但在更復雜的情況下無法工作,我有一對多關係(我得到異常「collection所有者未與會話關聯「時嘗試刪除父實體)。

有沒有辦法讓它工作? (保存,再次刪除保存同一實體)

+0

你爲什麼要在刪除後保存? – UpTheCreek 2011-01-11 10:43:31

回答

0

嘗試調用Session.Save或Session.Lock刪除的produit對象。

但是,您應該重新考慮您的設計以避免此問題。我會跟蹤要在一個單獨的集合中刪除的id,然後在提交事務時執行刪除操作。

2

不要在多對多關係中使用延遲加載嗎? 問題是你首先要加載實體,關閉會話並嘗試使用(已分離的)實體進行操作。在這種情況下,子實體是附屬於閉合會話的代理。你必須告訴NHibernate重新初始化代理:對於每個子實體調用NHibernateUtil.Initialize。

1

嘗試Merge而不是SaveOrUpdate。它查找數據庫中的記錄(插入或更新之前的附加選擇)。請注意,Merge有一個返回值,它在給定實例仍然是暫態時返回持久實例。您可能需要清理會話或創建新會話才能使其工作。

相關問題