如何在ASP.NET MVC Core中获取瞬态DbContext?

Hel*_*rld 3 c# dependency-injection entity-framework-core asp.net-core

我在Startup.cs中具有以下内容:

services.AddDbContext<MyDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("Sqlite")));
Run Code Online (Sandbox Code Playgroud)

现在,我想启动一个MyDbContext具有短暂生存期的实例。这样做的原因是因为我在启动时填充了缓存。那么,如何获得MyDbContext我负责处理自己的实例?我IServiceProvider准备好了。

serviceProvider.GetRequiredService<MyDbContext>();
Run Code Online (Sandbox Code Playgroud)

抛出一个异常,表明它不在范围内。

我知道为什么会引发异常,但是我不确定解决该异常的最佳方法是什么。

Joe*_*tte 6

您需要手动创建范围,如下所示:

using (var scope = serviceProvider.CreateScope())
{
    var scopedServices = scope.ServiceProvider; 
    scopedServices.GetRequiredService<MyDbContext>();

     ...
}
Run Code Online (Sandbox Code Playgroud)

这将提供一个有作用域的dbcontext,当您完成使用它时,它将由作用域关闭自动处理。在Web请求期间,将为每个请求自动创建一个作用域,以便在请求结束时将其释放。