2010-02-19 99 views
3

我目前正在開始一個新的ASP.NET MVC項目,我們需要生成一個項目成本估算。使用NHibernate的深度複製實體

我們使用NHibernate,ASP.NET MVC 1.0和StructureMap。

客戶希望能夠填寫有關該項目的所有信息,信息位於不同的頁面,我們需要堅持在每個回帖之間。

客戶端不想在完成時將其保存在某個名稱下的選項,但我們仍希望將其保存在數據庫中,即使他還沒有保存它。因此,我們有了創建「草稿模式」的想法,因此用戶將開始處理他的項目,填充所有頁面,並將其打開並保存在數據庫中。

但是我們需要管理草稿,我的意思是,當用戶開始編輯現有項目時,我們需要創建它的副本,將對象及其所有孩子設置爲草稿模式,並創建副本它在我們的數據庫中。我們需要改變孩子們的所有參考資料。因此,我試圖找到最佳方法來深度複製對象並更改所有引用, 我寧願不必爲每個我必須複製的實體創建一個複製類,也許某種東西如果這是可能的話,更通用。

請讓我知道你是否需要更多的細節,或者如果有什麼不清楚。

感謝,

查爾斯

回答

8

我會嘗試讓我的域名解決這個問題,並讓NHibernate只保存數據而不是複製它。我將創建一個定義DeepCopy()方法的IDeepCopy接口。然後,在這些方法中的每一種中,您都會創建一個新對象,並自己複製這些值,並控制要如何正確處理子對象或父對象。

1

這可能是糟糕的想法,我不知道它會工作,但如果你只是通過對象圖形去,並設置所有必需的ID爲默認未保存的值然後讓級聯保存完成將所有引用拼湊在一起的工作。

1

我建議爲您的項目使用SharpArchitecture。它會爲你節省很多時間和金錢。
有沒有簡單的方法來做一個深層的數據副本,因爲它是非常具體的案件。所以你必須手動創建所有副本。
我也建議爲草案實體使用不同的表格,而不是草稿。國際海事組織在這種情況下,它會更容易實施,它不會違反SRP。據說,分而治之。

1

我用這個函數:

public static T DeepClone<T>(T obj) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(ms, obj); 
      ms.Position = 0; 

      return (T)formatter.Deserialize(ms); 
     } 
    } 
+2

此,如果您有任何延遲加載的屬性/集將無法正常工作。在新實例上訪問這些屬性將導致LazyInitializationExceptions。 – rossisdead 2012-09-14 19:25:36