通过WCF发送实体的简单方法

时间:2011-08-10 14:12:41

标签: wcf entity-framework

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

1 个答案:

答案 0 :(得分:2)

为了避免客户端上的PROXY entites,您可以通过确保您的客户端已经引用服务器实体程序集来重用相同的实体(客户端和服务器端)(假设您已在EF中映射了POCO并将它们分成了他们自己的集会)。然后检查服务器引用中的高级选项,并确保选中“在引用的程序集中重用类型”。

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

您可以使用ClientBase<>泛型而不是服务引用来避免代理接口,尽管您现在需要将服务端接口(服务合同接口)拆分为单独的程序集并引用此在客户端和服务器上。

根据您的观察,如果您未将实体上的属性标记为[DataMember],则不会将其序列化。由于你的双方都有相同的实体,所以字段会在客户端上显示为默认值(0,null等)。