2012-06-16 81 views
0

我有一個我開發的Web應用程序,它有一個相當複雜的保存例程。用戶構建並修改一系列計劃,然後選擇保存數據。所有的添加,刪除和修改都會一次保存(全部在單個事務中)。NHibernate:SaveOrUpdate - 兒童上的重複鍵異常

Plan 
    Collection Of Child 
     Collection of ChildDetail 

大部分保存的是通過調用一個計劃對象SaveOrUpdate並讓這個保存管理計劃和它的孩子們表演。當我想要插入新記錄並使用cascade = all-delete-orphan來確保在客戶端刪除子對象或子細節對象時,我將零作爲未保存的值。

但是,當出現以下情況時,我正在接收異常:用戶使用子對象創建計劃並保存它們。這將節省罰款。

Plan(id=0) 
    Child[0](id=0), Child[1](id=0), Child[2](id=0) 

如果用戶然後刪除子對象,並在它們的位置添加新的子對象,然後嘗試保存更改。

Plan(id=123) 
    Child[0](id=0), Child[1](id=0), Child[2](id=0) 

這將引發無法與內部異常「指定SQL0803重複鍵值」插入孩子GenericAdoException。

我正在尋找的行爲是NHibernate刪除以前的子對象,然後在計劃上調用SaveOrUpdate時插入新對象。我怎樣才能做到這一點,同時讓父母管理關係?

回答

0

我目前找到的解決方案是將刪除的孩子的ID傳遞給保存例程。然後,我將新孩子的ID設置爲已移除孩子的ID。有效地將刪除/添加到更新中。