暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试必备:谈谈EF Core DbContext的生存期

DotNet开发跳槽 2021-07-22
1276

简述:

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



文章转载自DotNet开发跳槽,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论