Это относится к следующему, но не совсем так:
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 таким же образом?