2010-07-12 234 views
0

我有一個客戶類,其中包括存儲所有針對特定客戶的接觸一類,因此它們與外鍵關係鏈接。回滾實體框架4.0

這裏是我的方案:用戶編輯客戶信息,包括聯繫人,然後決定打「取消」按鈕。聯繫人綁定到網格,因此每次進行編輯/添加/刪除時,都會自動更新緩存數據庫上下文中的聯繫人實體。那麼我怎樣才能回滾用戶對Contact實體所做的所有更改?

我嘗試以下(後尋找答案谷歌):

public static void CustomerRollback(Customer customer) 
    { 
     dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, customer); 
     dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, customer.Contacts); 
    } 

但沒有奏效。任何其他想法?請注意,我的問題只是回滾Contacts實體。我想首先會導致問題的原因是網格會自動更新緩存的實體。所以當我嘗試取消時,每個聯繫人的EntityState已經更改爲已修改狀態(EntityState.Added,EntityState.Deleted等)。我是否需要循環訪問聯繫人並檢查他們的EntityState屬性並使用它進行操作?

感謝 凱撒

+2

上下文旨在成爲一個工作單元。 「回滾」工作的方式是處理上下文。這聽起來像你是在保持上下文太長。這具有深遠的消極後果。 – 2010-07-12 19:25:55

+0

下面u和devart都建議配置上下文,但這並不意味着我必須重新從數據庫中獲取所有數據?這會妨礙表現。 順便說一句,這不是一個長時間的上下文問題,因爲這個問題在我啓動應用程序的早期就會發生。我是唯一一個測試它的用戶,所以沒有併發問題。 – Caesar 2010-07-13 19:30:48

+0

您正在過早地優化。如果您使用單例上下文,您的長期性能可能已經很差。不要因爲想象中的性能影響而拒絕正確的實踐,而是應該按照打算使用的方式使用上下文,然後通過分析和點修復來修復任何性能問題。 – 2010-07-14 14:55:27

回答

2

因此,這裏是我做什麼,這是從實體框架1.0的解決方法技巧,我希望EF 4.0有一個更簡單的回滾對象上下文的方式。請與我分享,如果你知道更好的方法,這似乎工作暫時:

 // delete added objects that did not get saved 
     foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) 
     { 
      if (entry.Entity != null) 
       dbContext.DeleteObject(entry.Entity); 
     } 
     // Refetch modified objects from database 
     foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 
     { 
      if (entry.Entity != null) 
       dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity); 
     } 
     // Recover modified objects that got deleted 
     foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) 
     { 
      if (entry.Entity != null) 
       dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity); 
     } 

     dbContext.AcceptAllChanges(); 
1

看看在AcceptAllChanges方法。 SaveChanges(SaveOptions)也可能有幫助。
還有一個解決辦法是使用ObjectContext的實例作爲組的工作,並建立它的操作,並保存更改(當用戶確認,這是必要的),僅在必要時只配置上下文中另一種情況 - 這將放棄對上下文進行的更改。

+0

但是,如果我處理上下文,那麼我將不得不重新獲取所有數據,以備應用程序的其餘部分...這會很糟糕。 我會google你對工作單元的建議。 謝謝 – Caesar 2010-07-12 17:03:40