2009-07-13 158 views
7

使用VS 2008 & .NET 3.5 SP1:WCF,實體框架和數據合同

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

不幸的是,許多字段暴露並不意味着客戶端的消耗(即 - 誰正在訪問什麼數據的記錄等),並且出於安全原因,我寧願避免它們暴露。有沒有辦法避免以這種方式暴露實體框架類?

:這不是How to prevent private properties in .NET entities from being exposed as public via services?重複。在這個問題中,用戶希望有選擇地顯示某些字段,而我希望該實體根本不作爲DataContract公開。

在此先感謝。

+0

這可能類似於另一個沒有完全回答的帖子:'wcf和ADO實體框架',http://stackoverflow.com/questions/828302/wcf-and-ado-entity-framework – Malcolm 2009-07-13 20:37:00

+0

我同意回答您提供的「wcf和ADO實體框架」鏈接。或者你可以實現某種存儲庫模式。 – NikolaiDante 2009-07-13 20:46:31

+1

@Nath - 我絕對同意在「wcf和ADO實體框架」的答案,但不幸的是它不能解決我的問題。答案中的第一點是「自動生成實體框架實體」,它將公開我希望作爲DataContracts保密的數據。如果存儲庫模式由以這種方式生成的EF模型支持,則存在相同的問題 - 除非我錯過了某些內容? – Malcolm 2009-07-13 20:53:07

回答

13

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

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

另一方面,我總是建議不要通過Web服務暴露實體框架對象。不幸的是微軟用[DataMember]標記了實現依賴的屬性。我現在只需使用一個簡單的服務就可以從AdventureWorks返回一個SalesOrderHeader。下面EF類型的我的客戶收到的代理版本:

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

這些都不是東西你的客戶需要了解。

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

我還沒試過的一個選項是AutoMapper

3

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

2

我基本上看到兩件事情可以做:

  1. 要麼你刪除你不希望從DataContract通過手動刪除這些項目[數據成員]屬性揭露那些物品;在這種情況下,WCF將不會將這些屬性序列化出來
  2. 您只需使用那些成員來定義自己的WCF DataContract類,然後使用例如一個邏輯將EF實體轉換爲WCF DataContract。例如AutoMapper來消除(或至少限制)EF和WCF實體之間繁瑣的分配操作。

馬克