是否可以在WCF服务上使用Entity类的对象作为Data Contract?所以我可以在客户端发送它们。这是一种很好的设计方法吗?
我希望我的实体类也可以用作DTO,所以我可以将从数据库中检索到的数据发送到客户端。
答案 0 :(得分:4)
是的。如果您使用基于EntityObject
的实体,默认代码生成器和T4模板都应使用DataContract
和DataMember
属性标记它们。如果使用POCO,则必须修改模板以为您生成这些属性或手动创建POCO。
您需要使用这些属性的原因是循环引用的问题。默认情况下,EF在关系的两侧创建导航属性。在序列化期间,框架需要一些提示来了解该循环引用,否则它将进入无限循环。为避免该实体必须使用[DataContract(IsReference=true)]
标记,并且在使用DataContract
属性后,必须使用DataMember
标记每个序列化属性。
关闭延迟加载也很重要,因为否则序列化将触发每个导航属性的延迟加载,并且它将在所有延迟加载的实体上递归执行此操作。因此,您可以从服务中返回所有关系,所有关系等,而不是单个对象。