首页 > 解决方案 > 如何在 ASP.NET MVC Core 中获取瞬态 DbContext?

问题描述

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

services.AddDbContext<MyDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("Sqlite")));

现在,我想启动一个MyDbContext具有短暂生命周期的实例。这样做的原因是因为我在启动时填充了我的缓存。那么我怎样才能得到一个MyDbContext我负责处理自己的实例呢?我IServiceProvider手头有一个准备好的。

serviceProvider.GetRequiredService<MyDbContext>();

抛出一个异常,表示它超出了范围。

我理解为什么抛出异常,但我不确定解决它的最佳方法是什么。

标签: c#asp.net-coredependency-injectionentity-framework-core

解决方案


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

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

     ...
}

这将提供一个作用域 dbcontext,当您完成使用它时,该作用域闭包将自动释放它。在 Web 请求期间,每个请求都会自动创建一个范围,因此它会在请求结束时被释放。


推荐阅读