7

使用 VS 2008 和 .NET 3.5 SP1:

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

不幸的是,许多公开的字段并不是为了供客户端使用(即——谁正在访问什么数据的记录等),出于安全原因,我宁愿让它们不被公开。有没有办法避免实体框架类以这种方式暴露?

注意:这不是如何防止 .NET 实体中的私有属性通过服务公开为公共的?. 在那个问题中,用户希望有选择地显示某些字段,而我希望实体根本不作为 DataContract 公开。

提前致谢。

4

3 回答 3

13

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

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

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

  • 实体密钥成员
  • 结构对象
  • 实体对象
  • 实体键
  • 实体引用
  • 相关结束

这些不是您的客户需要知道的事情。

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

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

于 2009-07-13T21:51:57.473 回答
3

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

于 2009-07-13T21:05:39.360 回答
2

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

  1. 您可以通过手动删除这些项目上的 [DataMember] 属性来删除那些不想从 DataContract 公开的项目;在这种情况下,WCF 不会序列化属性
  2. 你定义你自己的 WCF DataContract 类,只包含你想要的那些成员,然后你想出一个逻辑来从你的 EF 实体转换到你的 WCF DataContract,例如使用AutoMapper来消除(或至少限制)繁琐的分配操作EF 和 WCF 实体。

马克

于 2009-07-13T21:16:46.593 回答