Aspnet Core DI + EF:“连接未关闭。连接的当前状态为连接中”

时间:2018-06-27 15:44:44

标签: c# asp.net-core dependency-injection entity-framework-core

这与以下内容有关,但并不完全相同: 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吗?

1 个答案:

答案 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。