【问题标题】:Straightforward way to send Entities over WCF通过 WCF 发送实体的简单方法
【发布时间】:2011-08-10 22:42:04
【问题描述】:

我正在使用实体框架 (4.1) 创建一个网站,它公开 WCF 服务,并且我有一个 Silverlight 客户端通过 WCF 与服务器通信。我想通过 WCF 服务发送(并且可能接收)一些实体,而不创建代理/包装器等类。例如,我有一个 User 实体类型,其中包含用户名、密码、电子邮件字段(实际上还有更多字段,但为了保持简单而缩短了),我想将此对象发送到 Silverlight 客户端。在发送用户名和电子邮件时,我(显然)不想将密码属性发送给客户端。现在,我正在编写一个带有[Serializable][DataContract] 属性的包装器,其中的字段具有[DataMember] 属性,其中仅包含我需要的字段,创建一个新实例,从实体对象复制值,并发送该代理对象。它有效,但不方便且非常痛苦。我需要的是一种机制,我可以直接设置我想要发送的属性,并且根本不暴露任何其他内容。我无法更改实体模型的代码(以添加/编辑属性),因为每次触摸 EDMX 时它都会自动重新生成。有没有办法实现只向客户公开选定的成员?

【问题讨论】:

  • 好问题!公开您自己的自定义 POCO 是我知道如何做的唯一方法。
  • 我同意杰的观点。您应该创建一个使用 [DataContract] 属性装饰的 DTO 类,该属性仅包含您需要的 [DataMembers]。您将需要从 EF 生成的实体映射到 DTO。
  • 好吧,那么,我将继续以同样的方式前进,因为这就是我正在做的事情..我只是想确定这是最好的方式..我可以接受那个答案,如果那是作为答案提交的话:)

标签: wcf entity-framework


【解决方案1】:

为了避免客户端上的代理实体,您可以通过确保您的客户端已经引用服务器实体程序集(假设您已在 EF 中映射 POCO 并将它们分离到他们自己的组装)。然后检查服务器参考中的高级选项,并确保选中“Reuse Types in referenced Assemblies”。

这将创建一个代理接口和客户端,但重用服务器实体。

您也可以通过使用ClientBase<> 泛型而不是服务引用来避免代理接口,尽管您现在需要将您的服务端接口(服务合同接口)剥离到一个单独的程序集中并在两者上引用它客户端和服务器。

根据您的观察,如果您没有将实体上的属性标记为 [DataMember],它将不会被序列化。由于双方都有相同的实体,因此字段 like 将作为其默认值(0、null 等)出现在客户端。

【讨论】:

  • 尽管它是一个很好的解决方法,但为非公开成员设置默认/空值并不是一个好的编程习惯,但我会看看它..
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2011-06-23
  • 2014-09-05
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多