【发布时间】:2013-03-11 19:52:43
【问题描述】:
我有一个在 WCF 中使用实体框架的问题。我正在使用 .NET 4.5 和 EF DbContext。
以下是我知道要在 WCF 中使用 EF 时要做的事情。可能它们不够用,或者有些不需要。
- 创建 EF ADO.NET 模型。
- 使用 DbContext 模板生成器将 POCO 类分离到一个单独的项目 (ProjectName: Entities)。
- 将POCO项目的TT模板指向数据项目(ProjectName:Data)中的edmx文件。 "..\Data\MyEdmx.edmx"
- 在 POCO 项目的 .TT 文件中添加 [DataContract(IsReference(True))] 和 [DataMemeber] 属性,以便类和属性具有序列化属性。将 Runtime.Serialization 引用添加到项目并将命名空间添加到 .TT 文件。这样可以在保存 .TT 文件时重新创建类或添加新实体时不会丢失您的属性声明。
- 添加 ProjectName:对数据项目的实体引用。
- 在数据项目的 Context.tt 文件中关闭 ProxyCreation 和 LazyLoading。
- 将 (ProjectName: Entities) 和 (ProjectName: Data) 添加到您的 wcf 服务项目中。
- 将 EntityFramework 连接字符串复制到您的 WCF 项目。
- 如果您希望填充导航对象,则服务中的所有选择方法都必须使用 .Include。当您想要加载或想要显示限制数据时,这可以提供更好的控制。此外,由于延迟加载关闭,您不会自动获取子项/相关项。
- 插入或更新或删除,服务必须创建上下文并手动设置要修改或添加的对象状态?否则将不会保存更改。使用 DbContext.Attach 适当地附加和设置实体的状态已添加、已修改等。
我遇到的问题是我找不到一个很好的示例来执行将 EF 与 WCF 结合使用的步骤。我只能看到零碎的东西。可能我是 WCF EF 世界的迟到者,因此找不到。
不确定我是否可以使用代理 WCF。我还没有完全理解代理的优势。
我还阅读了将 DTO 用作 EF 和服务之间的层的建议。这需要一个映射器到位。我不知道我是否需要它。但是这个想法很清楚,它有助于隐藏业务对象中显示的任何不必要的数据库列。例如,我们不会在客户端显示的审核列,例如创建者、更新者等。
我没有选择使用 DataServices,因为我失去了从 WCF 获得的其他绑定选项。我不知道失去 DataServices 考虑未来需要/支持其他绑定机制的客户的需求的简单性是否是一件好事。
感谢任何建议。
其他更新
我确实在 MSDN http://msdn.microsoft.com/en-us/library/ee705457(v=vs.100).aspx 中找到了这个。一些链接指向预发布文档。但这为我使用 EF 和 WCF 提供了更多思路。
这篇文章展示了如何在 WCF 中使用代理,POCO 的更改跟踪。这对我来说是一个好的开始。如果有人有更多建议,请提供您的想法。
更新 2 *N-Tier 的另一个优秀链接*
http://msdn.microsoft.com/en-us/magazine/dd882522.aspx
我很高兴我所花费的时间真的在教育我!
【问题讨论】:
-
@Aron:为什么?他明确写道,他“没有选择使用 DataServices”。我又添加了WCF标签。
-
我的错。问题是 WCF 作为 SOAP 技术对于 CRUD 来说是错误的“形状”。
标签: wcf entity-framework wcf-data-services