【发布时间】:2011-07-29 05:15:12
【问题描述】:
是否可以使用实体类的对象作为 WCF 服务上的数据契约?所以我可以在客户端发送它们。这是好的设计方法吗?
我也想将我的实体类用作 DTO,这样我就可以将从数据库检索到的数据发送到客户端。
【问题讨论】:
标签: wcf entity-framework-4.1 datacontract
是否可以使用实体类的对象作为 WCF 服务上的数据契约?所以我可以在客户端发送它们。这是好的设计方法吗?
我也想将我的实体类用作 DTO,这样我就可以将从数据库检索到的数据发送到客户端。
【问题讨论】:
标签: wcf entity-framework-4.1 datacontract
是的。如果您使用基于EntityObject 的实体,默认代码生成器和T4 模板都应使用DataContract 和DataMember 属性对其进行标记。如果您使用 POCO,则必须修改模板为您生成这些属性或手动创建 POCO。
您需要使用这些属性的原因是循环引用的问题。默认情况下,EF 在关系的两侧创建导航属性。在序列化期间,框架需要一些提示来了解该循环引用,否则它将进入无限循环。为避免实体必须用[DataContract(IsReference=true)] 标记,并且一旦使用DataContract 属性,就必须使用DataMember 标记每个序列化属性。
关闭延迟加载也很重要,因为否则序列化将触发每个导航属性的延迟加载,并且它将在所有延迟加载的实体上递归执行此操作。因此,您可以从服务中返回其所有关系、所有关系等,而不是单个对象。
【讨论】: