简述:
DbContext
的生存期从创建实例时开始,并在释放实例时结束。 DbContext
实例旨在用于单个工作单元。这意味着 DbContext
实例的生存期通常很短。
生存周期工作单元如下:
创建
DbContext
实例根据上下文跟踪实体实例。
实体将在以下情况下被跟踪
正在从查询返回
正在添加或附加到上下文
根据需要对所跟踪的实体进行更改以实现业务规则
调用 SaveChanges 或 SaveChangesAsync。
EF Core 检测所做的更改,并将这些更改写入数据库。
释放
DbContext
实例
注意事项:
使用后释放 DbContext 非常重要。这可确保释放所有非托管资源,并注销任何事件或其他挂钩,以防止在实例保持引用时出现内存泄漏。
DbContext 不是线程安全的。不要在线程之间共享上下文。请确保在继续使用上下文实例之前,等待所有异步调用。
EF Core 代码引发的 InvalidOperationException 可以使上下文进入不可恢复的状态。此类异常指示程序错误,并且不旨在从其中恢复。
扩展:
ASP.NET Core 依赖关系注入中的 DbContext
在许多 Web 应用程序中,每个 HTTP 请求都对应于单个工作单元。这使得上下文生存期与请求的生存期相关,成为 Web 应用程序的一个良好默认值。
使用依赖关系注入配置 ASP.NET Core 应用程序。可以使用 Startup.cs
的 ConfigureServices 方法中的 AddDbContext 将 EF Core 添加到此配置。例如:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
}
此示例将名为 ApplicationDbContext
的 DbContext
子类注册为 ASP.NET Core 应用程序服务提供程序(也称为 依赖关系注入容器)中的作用域服务。上下文配置为使用 SQL Server 数据库提供程序,并将从 ASP.NET Core 配置读取连接字符串。在 ConfigureServices
中的何处调用 AddDbContext
通常不重要。
ApplicationDbContext
类必须公开具有 DbContextOptions<ApplicationDbContext>
参数的公共构造函数。这是将 AddDbContext
的上下文配置传递到 DbContext
的方式。例如:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
然后,ApplicationDbContext
可以通过构造函数注入在 ASP.NET Core 控制器或其他服务中使用。例如:
public class MyController
{
private readonly ApplicationDbContext _context;
public MyController(ApplicationDbContext context)
{
_context = context;
}
}
最终结果是为每个请求创建一个 ApplicationDbContext
实例,并传递给控制器,以在请求结束后释放前执行工作单元。
有关配置选项的详细信息,请进一步阅读本文。此外,有关 ASP.NET Core 中的配置和依赖关系注入的详细信息,请参阅 ASP.NET Core 中的应用启动和 ASP.NET Core 中的依赖关系注入。
使用“new”的简单的 DbContext 初始化
可以按照常规的 .NET 方式构造 DbContext
实例,例如,使用 C# 中的 new
。可以通过重写 OnConfiguring
方法或通过将选项传递给构造函数来执行配置。例如:
public class ApplicationDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test");
}
}
通过此模式,还可以轻松地通过 DbContext
构造函数传递配置(如连接字符串)。例如:
public class ApplicationDbContext : DbContext
{
private readonly string _connectionString;
public ApplicationDbContext(string connectionString)
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
或者,可以使用 DbContextOptionsBuilder
创建 DbContextOptions
对象,然后将该对象传递到 DbContext
构造函数。这使得为依赖关系注入配置的 DbContext
也能显式构造。例如,使用上述为 ASP.NET Core 的 Web 应用定义的 ApplicationDbContext
时:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
可以创建 DbContextOptions
,并可以显式调用构造函数:
var contextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test")
.Options;
using var context = new ApplicationDbContext(contextOptions);
来源:https://docs.microsoft.com/zh-cn/
支持小微:
腾讯云 搞活动了?玩服务器的可以搞搞。就这几天时间。
云服务器限时秒杀,1核2G 首年95元!
链接:https://curl.qcloud.com/RX2amrlR
右下角,您点一下在看图片
小微工资涨1毛
商务合作QQ:185601686





