C# 如何在没有EF的情况下使用Breeze保存更改?

C# 如何在没有EF的情况下使用Breeze保存更改?,c#,.net,entity-framework,repository-pattern,breeze,C#,.net,Entity Framework,Repository Pattern,Breeze,我正在使用存储库,我真正努力的一件事是尽可能地使事物解耦。所以,如果明天我们从关系数据库转向其他的东西,比如NoSQL和类似的东西,我们就可以继续了,我们只需要改变DAL 我一直在尝试如何在我的WebAPI控制器中实现SaveChanges方法,而不需要使用EFContextProvider。我找到了Breeze NoDb示例,但是这个示例在存储库中使用了BreezeContextProvider。这让我很困扰,因为Breeze是一个JS库,所以它是关于我的应用程序的展示。在这种情况下,让存储库

我正在使用存储库,我真正努力的一件事是尽可能地使事物解耦。所以,如果明天我们从关系数据库转向其他的东西,比如NoSQL和类似的东西,我们就可以继续了,我们只需要改变DAL

我一直在尝试如何在我的WebAPI控制器中实现SaveChanges方法,而不需要使用
EFContextProvider
。我找到了Breeze NoDb示例,但是这个示例在存储库中使用了Breeze
ContextProvider
。这让我很困扰,因为Breeze是一个JS库,所以它是关于我的应用程序的展示。在这种情况下,让存储库使用来自Breeze的组件将DAL和演示结合起来,这是我不想做的

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


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

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

我发现数据库的转换,特别是从SQL到NoSQL的转换,是范式的一个重大转变。在我的一个应用程序中,我经历了从SQL到RavenDb的转换。尽管一切都已解耦,并且到处都使用存储库,但我仍然必须重写大部分应用程序存储逻辑


你想做的事——你不会需要它。因此,不要再让自己的生活变得艰难,继续实施功能。

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

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


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

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

如中所述,您可以继续使用ContextProvider将JObject转换为实体,然后将这些实体传递到相应的存储库。您的存储库不需要知道任何关于ContextProvider的信息