Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过WCF发送实体的简单方法_Wcf_Entity Framework - Fatal编程技术网

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

通过WCF发送实体的简单方法,wcf,entity-framework,Wcf,Entity Framework,我正在使用EntityFramework(4.1)创建一个网站,它公开了WCF服务,我有一个Silverlight客户端通过WCF与服务器通信。我想通过WCF服务发送(并可能接收)一些实体,而不创建代理/包装等类。例如,我有一个用户实体类型,其中包含用户名、密码、电子邮件字段(实际上更多,只是为了保持简单而缩短),我想将此对象发送到Silverlight客户端。在发送用户名和电子邮件时,我(显然)不想将Password属性发送给客户端。现在,我正在编写一个具有属性[Serializable]和[

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

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

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

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


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

好问题!公开您自己的自定义POCO是我知道的唯一方法。我同意Jay的观点。您应该创建一个DTO类,该类使用[DataContract]属性修饰,该属性仅包含[DataMembers]你需要。你将需要从EF生成的实体映射到DTO。好吧,那么,我将继续我正在做的事情。我只是想确定这是最好的方式。我可以接受这个答案,如果它作为答案提交:)尽管这是一个很好的解决方法,为非公开成员设置默认值/空值不是一个好的编程实践,但我将对此进行研究。。