2

我正在考虑在一个新项目中应用实体框架,因为我喜欢它的 OR/M-API 以及存储/概念模型映射功能(当然还有 Linq 和 Entity SQL)。

但是,如果 EF 实体在两者中都用作数据持有者,如何在 UI 层和业务层之间实现松散耦合。如果我在实体驻留在 UI 中时将实体附加到其 ObjectContext,则 UI 可能会绕过业务层并直接连接到数据库。如果我在将实体从它们的 ObjectContext 传递到 UI 之前将它们从它们的 ObjectContext 中分离出来,则不会有更改跟踪,因此我必须“重放”业务层中的所有更改,以便将它们持久化到数据库中(很难实现,尤其是亲子关系)。虽然我不希望业务层降级为“对象树持久性引擎”,但在某些情况下拥有这种能力会有所帮助。

这当然也适用于其他 OR-mapper,但一些替代产品似乎具有更好的分离/附加机制。

4

4 回答 4

4

“重播”更改比您想象的要容易。以下是您需要执行的操作的大致大纲:

  1. 在分离实体实例并将其交给 UI 之前,存储实体实例的“原始”版本。
  2. 让 UI 做它的事。
  3. 当您想要将 UI 所做的更改持久保存到数据库时,请获取您存储的原始版本,并将其附加到 EntityContext。将 UI 返回的修改版本中的更改应用到此实例。现在保存更改。实体框架将处理三向合并。
于 2008-09-18T13:40:11.577 回答
3

我不知道有任何 ORM 可以优雅地处理您希望具有平台独立性的 n 层解决方案。当一切都在 ObjectContext 中发生时,EF 工作得很好,当您有一个 n 层解决方案(物理分离、WCF/XML Web 服务调用)时,您必须做一些检查才能使对象正常运行。

您可以通过使用存储库模式分离出对 Ef 的 api 依赖项来实现松散耦合(http://blog.keithpatton.com/2008/05/29/Polymorphic+Repository+For+ADONet+Entity+Framework.aspx) . 但是,如果您直接在 UI 层中使用 EF 类,您将依赖于某些类型,例如 EntityReference、EntityKey 和 EntityObject,除非您决定深入研究让 EF 与纯 C# 类 (POCO) 一起工作的世界这对我来说似乎比它的价值更麻烦。

于 2008-10-07T06:46:08.367 回答
0

ADO.Net 团队的 Daniel Simmons 提供了一种扩展方法“AttachAsModified”来附加已修改的对象。

这不像重放更改那么聪明,但这使得它:我正在将它用于示例项目。

于 2009-01-06T02:20:38.067 回答
-1

谷歌“实体框架”和“不信任投票”,看看你得到了什么。

于 2008-09-17T13:38:52.633 回答