这与以下内容有关,但并不完全相同: EF. The connection was not closed. The connection's current state is connecting
我知道此错误可能是在处理DbContext时出现竞争状况的结果。
这是导致我遇到问题的原因的简化示例,以及解决该问题的解决方案。我只是不太了解我的解决方案为何起作用:
Startup.cs
services.AddDbContext<MyDbContext>(options => options.UseSqlServer("ConnString"));
// This will cause the "Connection was not closed..." error.
services.AddSingleton<IHostedService, SomeBackgroundService>(provider =>
new SomeBackgroundService(provider.GetRequiredService<MyDbContext>());
// Instead, I instantiate the DbContext here instead of letting DI do it
// and this eliminates the error.
services.AddSingleton<IHostedService, SomeBackgroundService(provider =>
new SomeBackgroundService(new MyDbContext(
new DbContextOptionsBuilder<MyDbContext>().UseSqlServer("ConnString").Options));
在SomeBackgroundService
内部,我执行一些异步查询,而同时在控制器方法中执行其他查询。
但是,既然如此,不应该使用provider.GetRequiredService<T>
以相同的方式实例化一个新的DbContext吗?
答案 0 :(得分:2)
官方文档提供了有关如何在主机服务https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1#consuming-a-scoped-service-in-a-background-task中使用范围服务的示例。
TL; DR您将IServiceProvider
(始终可用)注入到IHostedService实现中,然后为每次调用创建作用域并从那里解析DbContext。