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