是否可以使用实体作为数据契约?
是否可以使用实体类的对象作为 WCF 服务上的数据契约?所以我可以将它们发送到客户端。这是好的设计方法吗?
我希望我的实体类也可以用作 DTO,这样我就可以将从数据库检索到的数据发送到客户端。
Is it possible to use objects of Entity classes as Data Contract on WCF service ? So I can send them on the client side. is this good design approach ?
I want to my entity classes to be used as DTOs too, so I can send the data retrieved from database to the client.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的。如果您使用基于
EntityObject
的实体,默认代码生成器和 T4 模板都应使用DataContract
和DataMember
属性来标记它们。如果您使用 POCO,则必须修改模板来为您生成这些属性,或者手动创建 POCO。您需要使用这些属性的原因是循环引用问题。默认情况下,EF 在关系两侧创建导航属性。在序列化期间,框架需要一些提示来了解该循环引用,否则它将进入无限循环。为了避免实体必须用
[DataContract(IsReference=true)]
标记,并且一旦使用DataContract
属性,您必须使用DataMember
来标记每个序列化的属性。关闭延迟加载也很重要,因为否则序列化将触发每个导航属性的延迟加载,并且它将在所有延迟加载的实体上递归地执行此操作。因此,您可以从服务中返回其所有关系、它们的所有关系等,而不是单个对象。
Yes it is. If you use
EntityObject
based entities both default code generator and T4 template should mark them withDataContract
andDataMember
attributes. If you use POCOs you will have to either modify template to generate these attributes for you or create POCOs manually.The reason why you need to use those attributes is problem with circular reference. By default EF creates navigation properties on both sides of relation. During serialization, framework needs some hint to know about that circular reference otherwise it will go to infinite loop. To avoid that the entity must be marked with
[DataContract(IsReference=true)]
and once you useDataContract
attribute you must useDataMember
to mark each serialized property.It is also important to turn off lazy loading because otherwise serialization will trigger lazy loading on every navigation property and it will do this recursively on all lazily loaded entities. So instead of single object you can return from your service all its relations, all their relations, etc.