Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用默认DbContext和SpecificDbContext作为服务依赖项之间有什么区别吗?_C#_Entity Framework_Asp.net Core - Fatal编程技术网

C# 使用默认DbContext和SpecificDbContext作为服务依赖项之间有什么区别吗?

C# 使用默认DbContext和SpecificDbContext作为服务依赖项之间有什么区别吗?,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我们使用多个微服务应用程序,每个应用程序都有自己的特定DbContext。在所有这些上下文中,由于必要性,很少有实体被复制,例如,区域实体。我想使用单个服务对所有数据库上下文中的区域执行CRUD。这就是为什么我在这个服务中使用默认的DbContext作为依赖项,依赖每个微服务应用中的IoC容器来提供自己的特定的,我们称之为ExampleDbContext。然后我使用Set操作实体 我有一种不一致的行为——有时有效,但大多数时候我会: InvalidOperationException:在配置上下

我们使用多个微服务应用程序,每个应用程序都有自己的特定DbContext。在所有这些上下文中,由于必要性,很少有实体被复制,例如,
区域
实体。我想使用单个服务对所有数据库上下文中的区域执行CRUD。这就是为什么我在这个服务中使用默认的
DbContext
作为依赖项,依赖每个微服务应用中的IoC容器来提供自己的特定的,我们称之为
ExampleDbContext
。然后我使用
Set
操作实体

我有一种不一致的行为——有时有效,但大多数时候我会:

InvalidOperationException:在配置上下文时尝试使用该上下文。A. DbContext实例无法在OnConfigurang中使用,因为它是 此时仍在配置中。如果有一秒钟的时间,就会发生这种情况 操作在上一个操作之前在此上下文上启动 完成

据我所知,默认的罪魁祸首是同时使用相同的
DbContext
实例。我们所有的方法都是
async
,因此这当然是可能的,但我发现这不太可能,因为抛出的代码在应用程序启动时会在
程序.Main
方法中调用一次。不管怎样,我都不知道该如何确认或排除这种可能性

对此我感到奇怪的是,如果我用显式的
ExampleDbContext
替换
DbContext
,则不再抛出此错误。因此,我相信在如何实例化默认的
DbContext
方面存在一些差异

作为进一步说明,我认为
ExampleDbContext
被实例化了3次,因为它的
onconfigurang
方法中的断点被命中了3次

编辑 事实证明,使用特定的
ExampleDbContext
也会抛出,但很少抛出

编辑2 好的,在另一天调试并注释代码以指出问题之后,我可以确认这确实是对同一个
DbContext
实例的并行调用

拼图中仍然缺少一块: -为什么使用
DbContext
而不是
ExampleDbContext
抛出的次数更频繁


总的来说,我想这个故事的寓意是“花点时间消除问题的明显原因”。如果没有这些代码,请考虑其他原因,然后再发布请求帮助的信息。

如果没有这些代码,您很难理解您的请求。使用全局或长寿命的DbContext是一个坏主意,如果代码像连接一样发布,那么这一点很明显,因为上下文只用于很短的时间。如果没有代码,很难说为什么一个或另一个实例比另一个实例更频繁地失败。如果要将其放在DDD上下文中,DbContext实例就是UoW。它不是线程安全的,因为它没有意义——它包含一个业务操作的数据和更改。执行单个
savechangesync
调用后,将保留该操作期间所做的所有修改。这就是为什么它是一个DbContext,通常在
using
块中使用