WCF,实体框架&数据合同

时间:2009-07-13 20:34:35

标签: wcf entity-framework datacontract

使用VS 2008& .NET 3.5 SP1:

我使用WCF允许客户端连接到使用Entity Framework读取和写入数据库条目的服务。默认情况下,从数据库自动生成的实体应用了DataContract属性。

不幸的是,暴露的许多字段并不意味着客户端消费(即 - 谁正在访问哪些数据等的记录),出于安全考虑,我宁愿防止它们暴露。有没有办法避免以这种方式公开Entity Framework类?

注意 :这不是How to prevent private properties in .NET entities from being exposed as public via services?的重复。在该问题中,用户希望有选择地显示某些字段,而我希望实体根本不作为DataContract公开。

提前致谢。

3 个答案:

答案 0 :(得分:13)

您是否知道您的实体不需要与数据库一对一地映射?特别是,您可以省略不相关的列,甚至整个表。

实体模型是一个概念模型。您可以轻松地创建一组实体来暴露给一组客户端(可能是Web服务),另一组映射到同一个数据库,这可以用于不同的客户端(可能是Web应用程序)。

另一方面,我总是建议不要通过Web服务公开Entity Framework对象。不幸的是,Microsoft通过使用[DataMember]标记它们来公开依赖于实现的属性。我现在尝试使用一个简单的服务从AdventureWorks返回SalesOrderHeader。我的客户收到了以下EF类型的代理版本:

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

这些不是客户需要了解的事情。

我更喜欢公开数据传输对象,并将属性从一个复制到另一个。显然,通过反射或代码生成,这比通过手工完成更好。我过去通过代码生成完成了它(T4模板)。

我没有尝试的选项是AutoMapper

答案 1 :(得分:3)

我们为DataContract对象使用单独的类。我们有一个接口,一个方法,ToContract(),我们所有的实体都在一个部分类文件中实现这个接口。这是额外的工作,它是样板,但它似乎是获得我们需要的控制分离和粒度的最简单方法。

答案 2 :(得分:2)

我基本上看到你可以做的两件事:

  1. 您可以通过手动删除这些项目的[DataMember]属性来删除您不想从DataContract中公开的项目;在这种情况下,WCF不会将属性序列化
  2. 您可以使用所需的成员定义自己的WCF DataContract类,并使用例如使用例如EF实体转换为WCF DataContract的逻辑。像AutoMapper之类的东西可以消除(或至少限制)EF和WCF实体之间繁琐的分配操作。
  3. 马克