WCF,實體框架和數據合同

datacontract entity-framework wcf

使用VS 2008和.NET 3.5 SP1:

我正在使用WCF允許客戶端連接到使用Entity Framework讀取和寫入數據庫條目的服務。默認情況下,從數據庫自動生成的實體應用了DataContract屬性。

不幸的是,暴露的許多字段並不意味著客戶端消費(即 - 誰訪問哪些數據等的記錄),出於安全考慮,我寧願防止它們暴露。有沒有辦法避免以這種方式公開Entity Framework類?

注意 :這不是如何防止.NET實體中的私有屬性通過服務公開為公共? 。在該問題中,用戶希望有選擇地顯示某些字段,而我希望該實體根本不作為DataContract公開。

提前致謝。

一般承認的答案

您是否知道您的實體不需要與數據庫一對一映射?特別是,您可以省略不相關的列,甚至整個表。

實體模型旨在成為概念模型。您可以輕鬆地創建一組實體以暴露給一組客戶端(可能是Web服務),另一組映射到同一數據庫,這可以用於不同的客戶端(可能是Web應用程序)。

另一方面,我總是建議不要通過Web服務公開Entity Framework對象。不幸的是,Microsoft通過使用[DataMember]標記它們來公開依賴於實現的屬性。我現在嘗試使用一個簡單的服務從AdventureWorks返回SalesOrderHeader。我的客戶端收到了以下EF類型的代理版本:

  • EntityKeyMember
  • StructuralObject
  • EntityObject
  • 的EntityKey
  • 的EntityReference
  • RelatedEnd

這些不是您的客戶需要了解的事情。

我更喜歡暴露數據傳輸對象,並將屬性從一個複製到另一個。顯然,通過反射或代碼生成,這比通過手工完成更好。我過去通過代碼生成完成了它(T4模板)。

我沒有嘗試的選項是AutoMapper


熱門答案

我們為DataContract對象使用單獨的類。我們有一個接口,一個方法,ToContract(),我們所有的實體都在一個部分類文件中實現這個接口。這是額外的工作,它是樣板,但它似乎是獲得我們需要的控制分離和粒度的最簡單方法。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因