2009-07-13 118 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实体之间繁琐的分配操作。

马克