2011-04-22 146 views
3

我正在使用Service Layer --> Repository --> Entity Framework (Code-First) w/POCO objects方法,並且我在更新實體方面遇到困難。實體框架服務層更新POCO

我正在使用AutoMapper將我的域對象映射到我的視圖模型,這對於獲取數據非常有用,不知道如何將這些更改恢復到數據庫中?

使用純POCO對象,我會假設沒有任何更改跟蹤,所以我看到我唯一的選擇是自己處理它。你是否確保你的視圖模型具有與你的域對象相同的屬性?如果我只是改變視圖模型中的一個或兩個字段會怎樣?域對象上的其餘字段是否不會使用默認值在數據庫中被覆蓋?

這樣說,什麼是最好的方法?

謝謝!

編輯

那麼我就磕磕絆絆的就是這個,讓我們例如簡單Customer

1)Controller有一個服務,CustomerService,調用服務GetCustmoerByID方法。

2)Service調用CustomerRepository並檢索Customer對象。

3)Controller使用AutoMapper將Customer映射到ViewModel

4)Controller將模型交給View。一切都很好!

現在在視圖中,您可以對客戶進行一些修改並將其發送回控制器,以便將更改保留到數據庫中。

我會假設在這一點上對象是分離的。那麼模型是否應該具有與Customer對象相同的屬性?你是否必須爲每個你不想展示的物品製作隱藏的領域,這樣他們才能堅持下去?

如何處理將對象保存回數據庫?如果您的視圖/模型僅處理對象上的幾個字段會發生什麼?

+0

如果您使用Automapper進行單向映射,爲什麼不能用它映射另一種方式? – stephen776 2011-04-22 17:08:07

回答

3

你是絕對正確的,有一種超然的對象,你是負責通知有關的上下文中的分離實體的變化。

的基本方法是剛剛成立的實體進行修改。這適用於標量和複雜的屬性,但它不適用於導航屬性(FK關係除外) - 有關導航屬性檢查this answer(它與EFv4和ObjectContext API相關,但與DbContext API相同的問題)的問題的進一步閱讀。這種方法的缺點是DB中的所有字段都會被修改。如果您只想修改單個字段,您仍然必須正確填寫其他字段,否則數據庫記錄將被損壞。

有一個辦法明確定義哪些字段已經改變。您將設置每個屬性的修改狀態而不是整個實體。在通用方法上解決這個問題有點困難,但我試圖展示EFv4EFv4.1的某種方式。

5

如果您使用的是EF Code First,即:DbContext API,那麼您仍然有更改跟蹤,這由您的上下文類來處理。

在對對象進行更改之後,您只需在您的上下文中調用SaveChanges(),並將更改保存到數據庫中。

編輯

因爲要創建一個使用AutoMapper實體的「複製」,那麼它不再連接對上下文。

我猜你可以做什麼是類似於你在ASP.NET MVC中(與UpdateModel)。您可以從您的上下文中獲取原始實體,將您的ViewModel(可能包含已更改的屬性)和手動更新舊實體(僅修改屬性)或使用AutoMapper。然後使用context.SaveChanges()堅持更改。

另一解決方案是發送模型實體作爲視圖模型的一部分。]。這樣,您將使您的實體附加到容器,並且更改跟蹤將仍然有效。

希望這有助於:)

+0

請在OP中查看我的編輯。謝謝! – Sam 2011-04-22 17:42:13