2

我將很快開始編寫新的Web應用程序。應用程序將使用ASP.Net MVC 3和Entity Framework 4.1(數據庫優先方法)構建。我將使用ADO.NET POCO實體生成器創建POCO類,而不是使用默認的EntityObject類。實體框架POCO序列化

當我使用此工具創建POCO時,它會自動將Virtual關鍵字添加到所有屬性中,以便進行延遲加載的更改跟蹤和導航屬性。我曾閱讀並從演示中看到,Julie Lerman(EF Guru!)似乎關閉延遲加載並修改她的POCO模板,以便從她的POCO類中刪除Virtual關鍵字。 Julie說明了她這樣做的原因是因爲她正在編寫WCF服務的應用程序,並使用Virtual關鍵字導致序列化問題。她說,當一個對象被序列化時,序列化程序正在觸摸導航屬性,然後觸發延遲加載,並且在您知道它之前,您將通過導線拉動整個數據庫。

我覺得朱莉可能會說她可以把整個數據庫拉過來,但即使如此,這個想法讓我感到害怕!我的問題是(最後),我是否也應該爲我的MVC應用程序從我的POCO類中刪除Virtual關鍵字,並使用DectectChanges來處理我的更改跟蹤,並使用Eager Loading來請求導航屬性。

您的幫助將不勝感激。

非常感謝。

回答

4

序列化確實可以觸發延遲加載,因爲導航屬性的getter沒有辦法檢測調用者是序列化程序還是用戶代碼。

這不是唯一的問題:您是否擁有虛擬導航屬性或所有屬性,因爲虛擬EF將在運行時爲您的實體創建代理類型,因此序列化程序在運行時必須處理的實體實例通常爲與您定義的類型不同。

朱莉的建議是處理這些問題的最簡單和最合理的方式,但如果你仍然想使用代理的能力,工作的大部分時間,只是偶爾它們序列與WCF,還有其他的解決方法:

  • 可以使用DataContractResolver映射代理類型被序列化作爲原稿類型
  • 您也可以關閉延遲加載,只有當你將要序列化的圖形

莫爾e詳細信息包含在此博客文章中:http://blogs.msdn.com/b/adonet/archive/2010/01/05/poco-proxies-part-2-serializing-poco-proxies.aspx

除此之外,我的建議是使用DbContext模板而不是POCO模板。 DbContext是我們作爲EF 4.1的一部分發布的新API,旨在提供更高的生產力。它有幾個優點,例如它會自動執行DetectChanges,這樣你就不需要關心自己調用方法了。我們爲DbContext生成的POCO實體比我們使用POCO模板生成的POCO實體更簡單。你應該能夠使用DbContext找到很多MVC的例子。

0

那麼它取決於你的需要,如果你要序列化你的POCO類比你應該刪除它們(例如:當使用WCF服務或基本上任何將序列化你的整個對象)。但是,如果您只是構建需要訪問您的類的Web應用程序,而不是在控制您將通過代碼訪問您的類中的對象時將它們留在類中。