WCF,实体框架和数据合同(WCF, Entity Framework & Data Contrac

2019-06-25 19:59发布

使用VS 2008和.NET 3.5 SP1:

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

不幸的是很多领域的暴露不被客户端意味着消费 - 以及出于安全原因,我宁愿让他们免于暴露(即谁在访问什么数据等的记录)。 有什么办法,以避免在以这种方式暴露实体框架类?

注意 :这不是重复如何防止通过服务暴露公众在.NET实体私有财产? 。 在该问题的用户希望选择性地显示某些字段,而我想的实体不能在所有暴露作为DataContract。

提前致谢。

Answer 1:

你知道你的实体不需要映射一对一与数据库? 特别是,你可以离开了不相关的列,甚至整个表。

实体模型意味着是一个概念模型。 您可以轻松地创建一组曝光的实体来一组客户(Web服务,也许),而另一组,映射到同一个数据库,这是为不同的客户端(web应用程序,也许)。

在另一方面,我总是建议对通过Web服务暴露过实体框架的对象。 微软通过与[数据成员]标记他们不幸暴露实现相关的特性。 我刚才用一个简单的服务返回AdventureWorks中的一个SalesOrderHeader的尝试这样做。 我的客户收到了以下EF类型的代理版本:

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

这些都不是的东西你的客户需要了解。

我喜欢曝光数据传输对象,以及从一个到另一个复制的属性。 显然,这是更好地通过反射或代码生成完成,比手。 我已经在过去(T4模板)做到了通过代码生成。

我没有尝试过的一个选项是AutoMapper 。



Answer 2:

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



Answer 3:

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

  1. 要么你删除你不希望从DataContract通过手动删除这些项目[数据成员]属性揭露那些物品; 在这种情况下,WCF不会序列化的属性出来
  2. 你只有那些你想要的成员定义自己的WCF DataContract类,你拿出一个逻辑,从您的EF实体您的WCF DataContract转换,例如使用类似AutoMapper消除(或者至少限制)之间的繁琐的分配新建分配FY操作EF和WCF实体。



文章来源: WCF, Entity Framework & Data Contracts