使用VS 2008和.NET 3.5 SP1:
我使用WCF允许客户端连接到读取和写入使用实体框架的数据库条目的服务。 默认情况下被自动从数据库中生成的实体有应用的DataContract属性。
不幸的是很多领域的暴露不被客户端意味着消费 - 以及出于安全原因,我宁愿让他们免于暴露(即谁在访问什么数据等的记录)。 有什么办法,以避免在以这种方式暴露实体框架类?
注意 :这不是重复如何防止通过服务暴露公众在.NET实体私有财产? 。 在该问题的用户希望选择性地显示某些字段,而我想的实体不能在所有暴露作为DataContract。
提前致谢。
你知道你的实体不需要映射一对一与数据库? 特别是,你可以离开了不相关的列,甚至整个表。
实体模型意味着是一个概念模型。 您可以轻松地创建一组曝光的实体来一组客户(Web服务,也许),而另一组,映射到同一个数据库,这是为不同的客户端(web应用程序,也许)。
在另一方面,我总是建议对通过Web服务暴露过实体框架的对象。 微软通过与[数据成员]标记他们不幸暴露实现相关的特性。 我刚才用一个简单的服务返回AdventureWorks中的一个SalesOrderHeader的尝试这样做。 我的客户收到了以下EF类型的代理版本:
- EntityKeyMember
- StructuralObject
- EntityObject
- 的EntityKey
- 的EntityReference
- RelatedEnd
这些都不是的东西你的客户需要了解。
我喜欢曝光数据传输对象,以及从一个到另一个复制的属性。 显然,这是更好地通过反射或代码生成完成,比手。 我已经在过去(T4模板)做到了通过代码生成。
我没有尝试过的一个选项是AutoMapper 。
我们使用单独的类的DataContract对象。 我们有一个方法,ToContract()的接口,而且我们所有的实体实施局部类文件这个接口。 这是额外的工作,它的样板,但似乎得到控制的,我们需要的分离和粒度的最简单方法。