ASP.NET Core 5 中何时释放 DbContext 实例
When does a DbContext instance get disposed in ASP.NET Core 5
我正在使用推荐的方法通过依赖注入创建 DbContext
实例。
在Startup.cs-
services.AddDbContext<DashboardContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DashboardConnection")));
并在控制器中 -
private readonly DashboardContext db;
public AccountController(DashboardContext context)
{
db = context;
}
我想知道这个实例什么时候被处置。
以前我们总是使用 using
语句来处理大括号 -
using (DashboardContext db = new DashboardContext())
{
// Query
}
使用AddDbContext
方法,默认会创建一个DbContext
,生命周期为Scoped
;这意味着,它的生命周期在当前请求范围内,并且会在当前请求完成后立即处理。
但是您可以通过为 contextLifetime
参数传递一个值来覆盖默认值,例如 -
services.AddDbContext<DashboardContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DashboardConnection")),
ServiceLifetime.Transient);
进一步的细节检查 - AddDbContext
编辑-(回复@Dale 的评论):
考虑到 ASP.NET 核心 MVC 的整体架构,以及我们倾向于如何使用该框架,我会说(个人观点)通常对于大多数应用程序来说,最好坚持默认的 Scoped
生命周期.
在回答中,我只是想说明手动配置选项是为您准备的。当然,手动配置可能在某些用例或场景(取决于您设计自己的应用程序的方式)中发挥作用。
我正在使用推荐的方法通过依赖注入创建 DbContext
实例。
在Startup.cs-
services.AddDbContext<DashboardContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DashboardConnection")));
并在控制器中 -
private readonly DashboardContext db;
public AccountController(DashboardContext context)
{
db = context;
}
我想知道这个实例什么时候被处置。
以前我们总是使用 using
语句来处理大括号 -
using (DashboardContext db = new DashboardContext())
{
// Query
}
使用AddDbContext
方法,默认会创建一个DbContext
,生命周期为Scoped
;这意味着,它的生命周期在当前请求范围内,并且会在当前请求完成后立即处理。
但是您可以通过为 contextLifetime
参数传递一个值来覆盖默认值,例如 -
services.AddDbContext<DashboardContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DashboardConnection")),
ServiceLifetime.Transient);
进一步的细节检查 - AddDbContext
编辑-(回复@Dale 的评论):
考虑到 ASP.NET 核心 MVC 的整体架构,以及我们倾向于如何使用该框架,我会说(个人观点)通常对于大多数应用程序来说,最好坚持默认的 Scoped
生命周期.
在回答中,我只是想说明手动配置选项是为您准备的。当然,手动配置可能在某些用例或场景(取决于您设计自己的应用程序的方式)中发挥作用。