我扔在一個幾句話:
的臨界點在您的要求在我看來,以節省任何一個單一客戶或全部改變客戶的選項。您需要考慮到實體框架沒有方法來保存上下文中單個或少數選定對象的更改。您只能通過致電myContext.SaveChanges()
來保存整個工作單元(其中的ObjectContext
或DbContext
在EF中)的更改。
這導致您不能使用所有客戶名單及工作(= EF上下文)的一個單獨的單元,保持一切以客戶爲連接實體客戶詳細形式的結論。如果你這樣做,你可以提供一個功能/按鈕來保存的所有更改,但不能保存表格中當前客戶的選項。
所以,我會考慮如果你真的需要這些功能,或者我會與處於分離狀態的實體一起工作。這意味着您必須從數據庫加載客戶列表並在此之後處理上下文。當您保存更改時 - 現在無論是單個客戶的所有更改還是僅更改都無關緊要 - 您可以創建新的上下文,從數據庫中提取原始實體/實體並使用更改的屬性進行更新。
但隨着要麼安裝或拆卸實體工作 - 或者按次/形式既可以採用具有一個活EF上下文或只創建一個短版活每CRUD操作語境 - 在我看來是一個重要的設計決定。一般來說,在視圖/表單的生命週期中將您的實體附加到上下文中的可能性使您的程序員更容易,因爲它爲您提供了延遲加載和更改開箱即用功能等功能。所以如果你想放棄這一點,你可能會三思而後行。
要識別客戶對象是否已更改,EF上下文可能會有幫助,因爲它跟蹤對象的狀態。您可以爲客戶查詢ObjectStateManager並檢查它是否處於「已更改」狀態。但是要有這個選項,你需要像上面解釋的那樣與附屬實體一起工作。由於您無法保存(或取消)單個對象更改,所以向用戶顯示客戶1和客戶3已更改是否有意義是有問題的。 (我可能只會顯示「某些客戶已經改變」)。
如果您正在使用分離的實體,則必須通過實施某種「髒標誌」邏輯手動管理哪些客戶已更改或未更改。這裏有一個關於此的線程:
Different ways to implement 'dirty'-flag functionality
謝謝。我還需要跟蹤EF以外的已更改屬性,所以我設法通過處理對象PropertyChanged事件手動爲每個對象創建「已更改」屬性。 – DaveO 2011-04-15 05:18:03