首页 文章

WCF,实体框架和数据 Contract

提问于
浏览
7

使用VS 2008和.NET 3.5 SP1:

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

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

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

提前致谢 .

3 回答

  • 2

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

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

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

    • EntityKeyMember

    • StructuralObject

    • EntityObject

    • EntityKey

    • EntityReference

    • RelatedEnd

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

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

    我没试过的选项是AutoMapper .

  • 13

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

  • 3

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

    • 通过手动删除这些项目的[DataMember]属性,您可以删除不希望从DataContract公开的项目;在这种情况下,WCF不会将属性序列化

    • 您只使用您想要的那些成员定义自己的WCF DataContract类,并且您想出了一个逻辑,可以使用例如EF实体转换为WCF DataContract . 类似于AutoMapper来消除(或至少限制)EF和WCF实体之间繁琐的分配操作 .

相关问题