Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# Aspnet核心DI+;EF:“;连接没有关闭。连接';s当前状态为“正在连接”;_C#_Asp.net Core_Dependency Injection_Entity Framework Core - Fatal编程技术网

C# Aspnet核心DI+;EF:“;连接没有关闭。连接';s当前状态为“正在连接”;

C# Aspnet核心DI+;EF:“;连接没有关闭。连接';s当前状态为“正在连接”;,c#,asp.net-core,dependency-injection,entity-framework-core,C#,Asp.net Core,Dependency Injection,Entity Framework Core,这与以下内容有关,但并不完全相同: 我理解在处理DbContext时,这个错误可能是竞争条件的结果 下面是一个简单的例子,说明是什么导致了我的问题,以及我的解决方案。我只是不太明白为什么我的解决方案有效: Startup.cs services.AddDbContext(options=>options.UseSqlServer(“ConnString”); //这将导致“连接未关闭…”错误。 services.AddSingleton(提供者=> 新的SomeBackgroundServic

这与以下内容有关,但并不完全相同:

我理解在处理DbContext时,这个错误可能是竞争条件的结果

下面是一个简单的例子,说明是什么导致了我的问题,以及我的解决方案。我只是不太明白为什么我的解决方案有效:

Startup.cs

services.AddDbContext(options=>options.UseSqlServer(“ConnString”);
//这将导致“连接未关闭…”错误。
services.AddSingleton(提供者=>
新的SomeBackgroundService(provider.GetRequiredService());
//相反,我在这里实例化DbContext,而不是让DI来做
//这就消除了错误。
服务.AddSingleton
新建SomeBackgroundService(新建MyDbContext(
新的DbContextOptionsBuilder().UseSqlServer(“ConnString”).Options);
在我的
SomeBackgroundService
中,我执行一些异步查询,同时在控制器方法中执行其他查询


然而,在这种情况下,不应该使用
provider.GetRequiredService
以同样的方式实例化新的DbContext吗?

官方文档中有一些关于如何在hostes服务中使用作用域服务的示例


TL;DR您将
IServiceProvider
(始终可用)注入IHostedService实现中,然后每次调用创建一个作用域,并从此解析DbContext。

官方文档中有关于如何在hostes服务中使用作用域服务的示例


TL;DR您可以插入IServiceProvider(始终可用)在IHostedService实现中,然后为每次调用创建一个作用域,并从此处解析DbContext。

您不应该将singleton与
DbContext
结合使用。谢谢您的回答。我想我的问题更像是这样,即使我有一个singleton,我想provider.GetRequiredService也会创建一个DbContext实例以注入到我的singleton类中?是的,这实际上使
DbContext
也是一个singleton。现在,如果您尝试在HTTP请求中使用它,它将爆炸。我明白您的意思。不过,请原谅,我仍然有点困惑。使用DbContext的
IHostedService
是一个background任务,所以我认为后台任务实际上没有被“访问”跨HTTP请求,仅在后台运行。您是说在注册单例的上下文中使用的
provider.GetRequiredService
实际上不会创建DbContext实例,而是获取使用DI容器注册的现有DbContext,这将基于
服务。AddDbcontext
uld永远不能将单例与
DbContext
结合使用。谢谢您的回答。我想我的问题更像是这样,即使我有单例,我也认为provider.GetRequiredService会创建一个DbContext实例注入我的单例类中?是的,这实际上使
DbContext
也是一个单例。现在,如果你试图在HTTP请求中使用它,它会爆炸。我明白你的意思。不过请原谅,我还是有点困惑。使用DbContext的
IHostedService
是一个后台任务,所以我的想法是后台任务并没有真正被“访问”跨HTTP请求,仅在后台运行。您是说在注册singleton的上下文中使用的
provider.GetRequiredService
实际上不会创建DbContext实例,而是获取使用DI容器注册的现有DbContext,这将基于
服务。AddDbcontext
?谢谢ou David,我相信这对我来说是有意义的。那么我说
services.AddDbContext
将DbContext注册为作用域服务对吗?我会尝试一下,再次感谢!谢谢David,我相信这对我来说是有意义的。那么我说
services.AddDbContext
将DbContext注册为作用域服务对吗服务?我会试一试的,再次谢谢!