2013-04-03 120 views
0

在我的應用程序中,我需要檢索實體的大圖,在分離時進行各種更改(添加實體,進行更改,刪除實體),然後將圖保留回數據庫。我嘗試過STE,但它開始使我的客戶層的某些方面過於複雜,所以我希望通過使用POCO來保持簡單(至少在客戶端)。實體框架 - 堅持POCO實體的圖形

當涉及到持續的變化,我想我可以再從數據庫檢索的圖形,然後步行兩本圖,並從客戶端層的圖形,尋找差異: -

  • 一在數據庫圖中存在實體而不是客戶端圖的情況下刪除操作。據推測,我可以從數據庫圖表.Remove()這些。
  • 新實體是客戶端圖中ID爲0的實體。大概我可以將.Add()這些添加到數據庫圖中。
  • 我不確定處理更新的最佳方法。我不想在我的實體上實現「IsDirty」標誌,並且更喜歡更自動的解決方案。所以a)是否有辦法將客戶端圖中的實體與其數據庫中的實體進行比較,以確定它是否發生了變化,以及b)將客戶端實體應用/合併到數據庫對象中的最佳方式是什麼?

一旦完成了這一切,我估計只是在數據庫圖上調用SaveChanges()。我還必須將此圖傳回客戶端,以確保它具有最新版本(數據庫生成的值,如ID,時間戳)。

我的解決方案是否過於簡單?如果可行,我如何處理上面列出的更新?

+0

這是一個廣泛的主題。我建議你找到Lerman&Miller的書_DbContext_的副本,並閱讀第4章關於如何與斷開連接的實體一起工作。他們提出的方法是實現一個接口'IObjectWithState',它使對象跟蹤自己的更改狀態。我不能說它非常優雅,但可能比通過自己遍歷特定對象圖更通用。 –

回答

0

你的解決方案可以工作,但實現起來並不簡單 - 特別是如果你試圖做到某種程度上通用的(檢查this question中的答案 - 某人提供了應該已經實現的代碼庫)。它還會導致大量額外的流量到數據庫,因此當您預計會有重負時,它絕對不是一個好方法。最簡單的解決方案是@Gert Arnold提到的。

+0

我嘗試過萊爾曼方法,雖然它可以工作,但在BLL中有很多工作,因爲我使用的是非常大的層次結構。這也使得客戶更加複雜,因爲關係修復更多地涉及到其他事情。這只是一個2層WCF應用程序,所以我正在重新思考我的方法。如果您可以騰出幾分鐘回覆,請查看:http://stackoverflow.com/questions/15790286/poco-entities-in-a-2-tier-wcf-application –