【问题标题】:How to save changes with Breeze without EF?如何在没有 EF 的情况下使用 Breeze 保存更改?
【发布时间】:2014-01-23 21:13:52
【问题描述】:

我正在使用存储库,而我真正努力的一件事是尽可能地使事物解耦。因此,如果明天我们从关系数据库更改为其他东西,比如 NoSQL 之类的东西,我们很高兴,我们只需要更改我们的 DAL。

我一直在尝试找出如何在我的 WebAPI 控制器中实现 SaveChanges 方法,而无需使用 EFContextProvider。然后我找到了 Breeze NoDb 示例,但是此示例使用存储库中的 Breeze ContextProvider。这让我很困扰,因为 Breeze 是一个 JS 库,所以它与我的应用程序的呈现有关。在这种情况下,让存储库使用 Breeze 的组件会将 DAL 和演示文稿耦合在一起,这是我不想做的事情。

再次搜索如何在没有 EF 的情况下实现 SaveChanges 我发现 this 问题有一个很好的答案,告诉如何将 SaveBundle 转换为 SaveMap,然后告诉使用它来实现保存逻辑。但是我被困在这种方法中,因为 SaveMap 的条目只提供了一个 Type 对象和 EntityInfo,所以我看不到如何在我的存储库中使用它。

那么,如何在不引用 EFContextProvider 且不将存储库与 ContextProvider 耦合的情况下处理 SaveChanges?

【问题讨论】:

    标签: c# .net entity-framework repository-pattern breeze


    【解决方案1】:

    您是否打算从 SQL Server 切换到 NoSQL 数据库?为什么你现在不想这样做?您计划多久切换一次后备存储?可能不会经常,如果有的话。

    我发现数据库切换,尤其是从 SQL 到 NoSQL 是范式的重大转变。在我的一个应用程序中,我完成了从 SQL 到 RavenDb 的转换。尽管将所有内容解耦并在任何地方使用 Repositories,我仍然必须重写大部分应用程序存储逻辑。

    您正在尝试做的事情 - 您将不需要它。所以别再为难自己了,继续实现功能吧。

    【讨论】:

      【解决方案2】:

      ContextProvider 负责将 JObject(Json.NET 在 SaveChanges 方法中为您提供)转换为真实的类型化 .NET 对象。 ContextProvider 为每个实体创建的 EntityInfo 对象包含实体对象本身,以及它从客户端获取的entityAspect 属性:EntityState(添加、修改或删除),所有更改的原始值属性,以及任何自动生成的键的临时值。这是您自己保存实体所需的信息。为方便起见,“SaveMap”只是按类型组织它们,但您可以随意操作它们。

      post you referenced 中所述,您可以继续使用 ContextProvider 将 JObject 转换为实体,然后将这些实体传递到适当的存储库。您的存储库不需要了解有关 ContextProvider 的任何信息。

      【讨论】:

        【解决方案3】:

        Breeze 提供了一个 NHibernate 提供程序,您可以查看该提供程序,它显示了如何与仍然是 .NET 服务器的非 EF 后端通信。 ContextProvider 是一种使实现任何 .NET 提供程序变得更加容易的便利,但这绝不是必需的。

        至于 NoSQL,您应该看一下在 NodeJs 中托管的微风节点提供程序和 MongoDB 示例(这表明 ContextProvider 显然不是必需的)。

        我们还希望在不久的将来有一个用 Java 编写的 Breeze 服务器实现,它再次没有“ContextProvider”要求。

        【讨论】:

          猜你喜欢
          • 2021-01-06
          • 1970-01-01
          • 2017-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-08
          • 1970-01-01
          相关资源
          最近更新 更多