【Entity Framework】 EF中DbContext类详解

【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添加到次配置。

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 的方式。 例如:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/562625.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LAMP架构与搭建论坛

目录 1、LAMP架构简述 2、各组件作用 3、构建LAMP平台 3.1编译安装Apache httpd服务 3.1.1关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 3.1.2安装环境依赖包 3.1.3配置 设置安装目录、安装模块 3.1.4编译安装 3.1.5优化配置文件路径 3.1.6启动apache…

2024智能短信营销推广系统使用攻略

智能短信营销推广系统以其精准、高效的特点&#xff0c;成为企业与消费者建立联系的重要桥梁。云衔科技凭借其先进的技术和专业的服务&#xff0c;为企业提供了一套完善的智能短信营销推广系统解决方案&#xff0c;让企业在短时间内实现大规模、个性化的短信营销活动。 云衔科…

linux源配置:ubuntu、centos;lspci与lsmod命令区别

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

ng发布静态资源 发布项目 发布数据

描述&#xff1a;把一个项目或者数据发布出来&#xff0c;通过http的形式访问&#xff0c;比如发布一个js文件&#xff0c;用http://localhost:6060/data/jquery/jquery.min.js访问。 步骤&#xff1a;配置nginx.conf文件&#xff0c;nginx.conf位于conf目录下&#xff0c;在se…

如何从零开始拆解uni-app开发的vue项目(一)

uni-app项目分析: 背景:最近接手一个前同事留下的半拉子项目,出拿过来觉得很简单;当我看到app.vue的时候很确定是vue项目,心里不怎么慌,果断安装node.js,然后就去npm ;安装VS code,事实并不是我期盼的那样,或者说根本就不能运行。 报错:应用vs code打开文件,输入命…

C++ vector容器类型

vector类为内置数组提供了一种替代表示&#xff0c;与string类一样 vector 类是随标准 C引入的标准库的一部分 &#xff0c;为了使用vector 我们必须包含相关的头文件 &#xff1a; #include <vector> 使用vector有两种不同的形式&#xff0c;即所谓的数组习惯和 STL习…

什么是浏览器指纹识别?Maskfog指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

01.重新认识文件(Linux基本概念)

知识引入&#xff1a; 我们经常使用word或者wps写的论文、作业等都是文件&#xff0c;而我们这样对文件的认识也比较片面。我们是否思考过&#xff0c;如果文件里面没有写东西&#xff0c;那么计算机会不会保存呢&#xff1f;答案是&#xff0c;肯定会的。因为我们每次建的空文…

Mysql---备份恢复

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Mysql日志类型 错误日志&#xff1a; 错误日志主要记录如下几种日志&#xff1a; 服务器启动和关闭过程中的信息 服务器运行过程中的错误信息 事件调度器运行一个时间是产生的信息 在从服…

unity学习(68)——相机/模型的旋转/位置计算

这个比想象中要难&#xff0c;而且需要自己写。 1.相机可以转xy两个位置&#xff0c;可以点头和转圈。注意这里有一个if判断&#xff08;后面返回来发现了这些问题&#xff09; 2.角色不能点头&#xff0c;只能转圈。 难得是移动方向&#xff0c;因为移动方向(位置)和转向是相…

unicloud 云函数 介绍及使用

普通云函数 callFunction方式云函数&#xff0c;也称之为普通云函数。 uni-app的前端代码&#xff0c;不再执行uni.request联网&#xff0c;而是通过uniCloud.callFunction调用云函数。 callFunction方式避免了服务器提供域名&#xff0c;不暴露固定ip&#xff0c;减少被攻击…

浅析扩散模型与图像生成【应用篇】(十一)——DDIBs

11. Dual Diffusion Implicit Bridges for Image-to-Image Translation 该文提出一种双扩散隐式桥&#xff08;Dual Diffusion Implicit Bridges&#xff0c; DDIBs&#xff09;方法用于图像转换&#xff0c;其最大的特点在于处理源域图像的模型和处理目标域图像的模型是彼此分…