2

我有一个在 WCF 中使用实体框架的问题。我正在使用 .NET 4.5 和 EF DbContext。

以下是我知道在 WCF 中使用 EF 时要做的事情。可能是它们不够,或者有些不是必需的。

  1. 创建 EF ADO.NET 模型。
  2. 使用 DbContext 模板生成器将 POCO 类分离到一个单独的项目 (ProjectName: Entities)。
  3. 将POCO项目的TT模板指向数据项目中的edmx文件(ProjectName:Data)。“..\数据\MyEdmx.edmx”
  4. 在 POCO 项目的 .TT 文件中添加 [DataContract(IsReference(True))] 和 [DataMemeber] 属性,以便类和属性具有序列化属性。将 Runtime.Serialization 引用添加到项目并将命名空间添加到 .TT 文件。这使得在保存 .TT 文件或添加新实体时重新创建类时不会丢失您的属性声明。
  5. 添加 ProjectName:对 Data 项目的实体引用。
  6. 在数据项目的 Context.tt 文件中关闭 ProxyCreation 和 LazyLoading。
  7. 将 (ProjectName: Entities) 和 (ProjectName: Data) 添加到您的 wcf 服务项目。
  8. 将 EntityFramework 连接字符串复制到您的 WCF 项目。
  9. 如果您希望填充导航对象,则服务中的所有选择方法都必须使用 .Include。当您想要加载或想要显示限制数据时,这可以提供更好的控制。此外,由于延迟加载关闭,您不会自动获得孩子/相关。
  10. 插入或更新或删除,服务必须创建上下文并手动设置要修改或添加的对象状态?否则将不会保存更改。使用 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

我很高兴我所花费的时间真的在教育我!

4

1 回答 1

0

经过大量阅读这里和其他论坛后,我在将 EF 与 WCF 结合使用方面取得了进展。

我按照前面的步骤进行。我能够看到使用 DTO 的优势。这确实允许您隐藏不需要向客户端或其他服务公开的字段。但由于时间限制,我不愿引入 DTO。

我使用了 context.Attach、context.Add 和 context.Entry。

我还做了一个小原型来使用 WCF 数据服务。那是非常快节奏的发展。由于学习其功能的时间限制,我暂时不使用 WCF 数据服务。

于 2013-03-22T15:27:15.320 回答