2011-04-14 60 views
2

我還在學習有關的工作模式,倉庫圖案單位等保存一,全部保存在實體框架

我的應用程序:

  • 我有實體的名單,說客戶一個列表視圖
  • 當我選擇客戶詳細信息表單顯示,在那裏他們的詳細資料可以被編輯

我想了解辦成跟隨着標準MVVM /實體框架的方式G:

  • 當用戶編輯一個客戶它顯示爲「改變」(但不保存)
  • 可以選擇要麼保存當前客戶,或保存所有更改的客戶用戶
  • 另存或保存所有命令/按鈕被禁用,如果該選項不可用(當前客戶不變,或所有客戶不變)

似乎夠簡單嗎?但我不知道如何使用MVVM/EF來解決這個問題。我是否使用UoW,是否分離對象並重新連接到上下文,以便一次只能保存一個對象?如何檢測對象是否更改或未更改?

幫助!謝謝!

回答

4

我扔在一個幾句話:

的臨界點在您的要求在我看來,以節省任何一個單一客戶或全部改變客戶的選項。您需要考慮到實體框架沒有方法來保存上下文中單個或少數選定對象的更改。您只能通過致電myContext.SaveChanges()來保存整個工作單元(其中的ObjectContextDbContext在EF中)的更改。

這導致您不能使用所有客戶名單及工作(= EF上下文)的一個單獨的單元,保持一切以客戶爲連接實體客戶詳細形式的結論。如果你這樣做,你可以提供一個功能/按鈕來保存的所有更改,但不能保存表格中當前客戶的選項。

所以,我會考慮如果你真的需要這些功能,或者我會與處於分離狀態的實體一起工作。這意味着您必須從數據庫加載客戶列表並在此之後處理上下文。當您保存更改時 - 現在無論是單個客戶的所有更改還是僅更改都無關緊要 - 您可以創建新的上下文,從數據庫中提取原始實體/實體並使用更改的屬性進行更新。

但隨着要麼安裝或拆卸實體工作 - 或者按次/形式既可以採用具有一個活EF上下文或只創建一個短版活每CRUD操作語境 - 在我看來是一個重要的設計決定。一般來說,在視圖/表單的生命週期中將您的實體附加到上下文中的可能性使您的程序員更容易,因爲它爲您提供了延遲加載和更改開箱即用功能等功能。所以如果你想放棄這一點,你可能會三思而後行。

要識別客戶對象是否已更改,EF上下文可能會有幫助,因爲它跟蹤對象的狀態。您可以爲客戶查詢ObjectStateManager並檢查它是否處於「已更改」狀態。但是要有這個選項,你需要像上面解釋的那樣與附屬實體一起工作。由於您無法保存(或取消)單個對象更改,所以向用戶顯示客戶1和客戶3已更改是否有意義是有問題的。 (我可能只會顯示「某些客戶已經改變」)。

如果您正在使用分離的實體,則必須通過實施某種「髒標誌」邏輯手動管理哪些客戶已更改或未更改。這裏有一個關於此的線程:

Different ways to implement 'dirty'-flag functionality

+0

謝謝。我還需要跟蹤EF以外的已更改屬性,所以我設法通過處理對象PropertyChanged事件手動爲每個對象創建「已更改」屬性。 – DaveO 2011-04-15 05:18:03