是否可以将实体用作数据合同?

时间:2011-07-29 05:15:12

标签: wcf entity-framework-4.1 datacontract

是否可以在WCF服务上使用Entity类的对象作为Data Contract?所以我可以在客户端发送它们。这是一种很好的设计方法吗?

我希望我的实体类也可以用作DTO,所以我可以将从数据库中检索到的数据发送到客户端。

1 个答案:

答案 0 :(得分:4)

是的。如果您使用基于EntityObject的实体,默认代码生成器和T4模板都应使用DataContractDataMember属性标记它们。如果使用POCO,则必须修改模板以为您生成这些属性或手动创建POCO。

您需要使用这些属性的原因是循环引用的问题。默认情况下,EF在关系的两侧创建导航属性。在序列化期间,框架需要一些提示来了解该循环引用,否则它将进入无限循环。为避免该实体必须使用[DataContract(IsReference=true)]标记,并且在使用DataContract属性后,必须使用DataMember标记每个序列化属性。

关闭延迟加载也很重要,因为否则序列化将触发每个导航属性的延迟加载,并且它将在所有延迟加载的实体上递归执行此操作。因此,您可以从服务中返回所有关系,所有关系等,而不是单个对象。