Aspnet Core DI + EF: «Соединение не было закрыто. Текущее состояние соединения установлено» - PullRequest
0 голосов
/ 27 июня 2018

Это относится к следующему, но не совсем так: EF. Соединение не было закрыто. Текущее состояние соединения:

Я понимаю, что эта ошибка может быть результатом состояния гонки при работе с 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 голосов
/ 30 июня 2018

В официальной документации есть примеры того, как использовать сервисы с областью действия в хост-сервисе 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.

...