【Entity Framework】 EF中DbContext类详解

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 【Entity Framework】 EF中DbContext类详解

一、概述

DbContext类是实体框架的重要组成部分。它是应用域或实例类与数据库交互的桥梁。


从上图可以看出DbContext是负责与数据交互作为对象的主要类。DbContext负责以下活动:


  1. EntitySet:DbContext包含映射到数据库表的所有实体的实体集(DbSet)。
  2. 查询(Querying):DbContext将Linq-To-Entities查询转换为SQL查询并将其发送到数据库。
  3. 更改跟踪(Change Tracking):跟踪实体在从数据库查询后发生的更改
  4. 持久数据(Persisting Data):它还根据实体的状态对数据库执行插入,更新和删除操作。
  5. 缓存(Caching): DbContext默认进行一级缓存。它存储在上下文类生命周期中已经被检索的实体。
  6. 管理关系(Manage Relationship): DbContext还使用DB-First或Model-First方法使用CSDL,MSL和SSDL或者使用Code-First方法使用流利的API来管理关系。
  7. 对象实现(Object Materialization): DbContext将原始表数据转换为实体对象。


二、DbContext生存期

DbContext的生存期从创建实例时开始,并在释放实例时结束。DbContext实例皆在用于单个工作单元。这意味着DbContext实例的生存期通常很短。

工作单元将持续跟踪在可能影响数据库的业务事务中执行的所有操作。 当你完成操作后,它将找出更改数据库作为工作结果时需要执行的所有操作

使用Entity Framework Core(EF Core)时的典型工作单元包括:

  • 创建DbContext实例


  • 根据上下文根据实体实例。实体将在以下情况下被追踪


  • 正在从查询返回
  • 正在添加或附加到上下文中
  • 根据需要对所追踪的实体进行更改以实现业务规则


  • 调用SaveChanges或SaveChangesAsync。EF Core检测所做的更改,并将这些更改写入数据库。


  • 释放DbContext实例
  • 使用后释放DbContext非常重要。这可确保释放所有非托管资源,并注销任何事件或其他挂钩,以防止在实例保持引用时出现内存泄露。
  • DbContext不是线程安全的。不要在线程之间共享上下文。请确保在继续使用上下文实例之前,等待所有异步调用。
  • EF Core 代码引发的InvalidOperationException可以使上下文进入不可恢复的状态。此类异常指示程序错误。


三、ASP.NET Core依赖关系注入中的DbContext

在许多Web应用程序中,每个HTTP请求都对应于单个工作单元。这使得上下文生存期与请求的生存期相关,成为Web应用程序的一个良好默认值。

使用依赖关系注入配置ASP.NET Core应用程序。可以使用Startup.csConfigureServices方法中的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)
    {
    }
}

四、使用"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也能显示构造。

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

五、DbContextOptions

所有 DbContext配置的起始点都是DbContextOptionsBuilder。可以通过三种方式获取此生成器:

  • AddDbContext和相关方法中
  • OnConfiguring
  • 使用new显示构造

上述各节显示了其中每个示例。 无论生成器来自何处,都可以应用相同的配置。 此外,无论如何构造上下文,都将始终调用 OnConfiguring。 这意味着即使使用 AddDbContextOnConfiguring 也可用于执行其他配置。


六、DbContext类的方法

Entry:获取DbEntityEntry给定的实体。该条目提供访问更改实体的跟踪信息和操作。


SavaChange:对已添加,已修改或已删除状态的实体的数据库执行INSERT,UPDATE或DELETE命令。


SaveChangesAsync: SaveChanges()的异步方法。


Set: 创建一个DbSet可以用来查询和保存实例的TEntity。

相关实践学习
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
28天前
|
开发框架 缓存 .NET
【Entity Framework】EF中DbSet类详解
【Entity Framework】EF中DbSet类详解
14 1
【Entity Framework】EF中DbSet类详解
|
28天前
|
SQL 存储 开发框架
实体框架EF(Entity Framework)简介
实体框架EF(Entity Framework)简介
31 7
|
28天前
|
SQL 存储 开发框架
【Entity Framework】EF中的增删改查
【Entity Framework】EF中的增删改查
17 0
|
28天前
|
开发框架 .NET 数据库
【Entity Framework】EF中SaveChanges如何使用
【Entity Framework】EF中SaveChanges如何使用
15 0
|
28天前
|
存储 SQL API
【Entity Framework】EF中实体属性
【Entity Framework】EF中实体属性
13 0
|
28天前
|
SQL 数据库连接 数据库
【Entity Framework】EF连接字符串和模型
【Entity Framework】EF连接字符串和模型
10 0
|
28天前
|
SQL 数据库
【Entity Framework】如何理解EF中的级联删除
【Entity Framework】如何理解EF中的级联删除
16 0
|
28天前
|
存储 SQL 开发框架
【Entity Framework】如何使用EF中的生成值
【Entity Framework】如何使用EF中的生成值
14 0
|
28天前
|
SQL API 数据库
【Entity Framework】EF配置文件设置详解
【Entity Framework】EF配置文件设置详解
12 0
|
28天前
|
存储 SQL 开发框架
【Entity Framework】聊一聊EF中继承关系
【Entity Framework】聊一聊EF中继承关系
10 0