【Entity Framework】 EF中DbContext类详解

news/2024/5/20 0:33:37 标签: oracle, 数据库, .netcore, microsoft, c#

【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实例

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

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

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

  • 释放DbContext实例

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

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

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

使用依赖关系注入配置ASP.NET Core应用程序。可以使用Startup.csConfigureServices方法中的AddDbContext将EF Core添加到次配置。

c#">public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddDbContext<ApplicationDbContext>(
        options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
}

此示例将名为 ApplicationDbContextDbContext 子类注册为 ASP.NET Core 应用程序服务提供程序(也称为依赖关系注入容器)中的作用域服务。 上下文配置为使用 SQL Server 数据库提供程序,并将从 ASP.NET Core 配置读取连接字符串。 在 ConfigureServices 中的何处调用 AddDbContext 通常不重要。

ApplicationDbContext 类必须公开具有 DbContextOptions<ApplicationDbContext> 参数的公共构造函数。 这是将 AddDbContext 的上下文配置传递到 DbContext 的方式。 例如:

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

四、使用"NEW"的简单的DbContext初始化

可以按照常规的 .NET 方式构造 DbContext 实例,例如,使用 C# 中的 new。 可以通过重写 OnConfiguring 方法或通过将选项传递给构造函数来执行配置。 例如:

c#">public class ApplicationDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test");
    }
}

通过此模式,还可以轻松地通过 DbContext 构造函数传递配置(如连接字符串)。 例如:

c#">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


http://www.niftyadmin.cn/n/5446802.html

相关文章

【小白入门篇1】GPT到底是怎样练成?

由于具有代表性的OpenAI公司GPT模型并没有开源&#xff0c;所以本章节是参考一些开源和现有课程&#xff08;李宏毅&#xff09;讲解ChatGPT原理。本章没有涉及到很多数学运算&#xff0c;比较适合小白了解GPT到底是怎么练成。GPT的三个英文字母分别代表Generative(生成式)&…

Linux安装Nacos

安装前必要准备 准备Java环境 &#xff0c;8以上的版本&#xff0c;mysql&#xff08;集群相关信息&#xff09;&#xff0c;nginx&#xff08;进行代理&#xff09; 安装Nacos 首先我们要有一个nacos的包&#xff0c;我们可以在线下载&#xff0c;也可以提前下载好&#xf…

vue 安装脚手架报错 certificate has expired

vue 安装脚手架的时候报错&#xff0c;报错信息如下&#xff1a; 错误信息&#xff1a;npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired 翻译&#xff1a;npm ERR&#xff01;请求到https://registry.npm.taobao.org…

Python 很简单。 Go 很简单。简单!=简单。

【来源】 https://preslav.me/2023/11/27/python-is-easy-golang-is-simple-simple-is-not-easy/ Python 和 Go 具有独特的品质&#xff0c;可以相辅相成。 有一个常见的误解&#xff0c;认为简单和容易指的是同一件事。毕竟&#xff0c;如果某个东西易于使用&#xff0c;那么…

数字孪生底层技术框架

数字孪生是一种将现实世界中的物理实体、过程或系统数字化并映射到计算机模型中的方法。它在数学建模与仿真方面具有重要作用&#xff0c;为了实现数字孪生&#xff0c;以下是一些底层技术框架和方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业…

【数据结构基础】之八大排序(C语言实现)

【数据结构基础】之八大排序(C语言实现&#xff09; &#x1f427; 冒泡排序♈️ 冒泡排序原理及代码实现♈️ 稳定性分析 &#x1f427; 选择排序♈️ 选择排序原理及代码实现♈️ 稳定性分析 &#x1f427; 插入排序♈️ 插入排序的原理及代码实现♈️ 稳定性分析 &#x1f4…

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界…

学点儿Java_Day9_ArrayList应用_简易的学生信息添加搜索Demo

简介 主要是ArrayList的应用练手&#xff0c;没连数据库&#xff0c;纯控制台输入&#xff0c;实现添加学生信息和根据指定信息搜索功能。 知识点 1 ArrayList<Student> studentList new ArrayList<>(); 2 while(true)...实现输入字符串控制&#xff0c;输入数…