当前位置: 首页 > news >正文

EFCore相关知识分享

EFCore相关知识分享


文章目录

  • EFCore相关知识分享
  • 前言
  • EFCore 的优势
  • SaveChang的作用
  • EF Core 查询优化小技巧
    • 使用投影(投影到所需的数据类型)
    • 延迟加载(Lazy Loading)与显式加载(Eager Loading)
    • 使用 AsNoTracking
    • 减少客户端评估(Client Evaluation)
    • 使用合适的索引
    • 避免 Select * 和不必要的 Include
    • 使用异步查询(Async Queries)
    • 分析和优化生成的 SQL 查询
    • 使用批量操作(Batching)和分页(Paging)
  • EF Core中entitystate的作用
  • EF Core中引用属性和导航属性
    • 引用属性‌
    • 导航属性
      • 集合导航属性
      • 引用导航属性‌
  • EF Core中如何通过数据生成实体和dbcontext?
  • EF Core如何处理并发?
    • 使用乐观并发
    • 异常处理与重试机制
    • 使用悲观锁(悲观并发控制)
    • 对于并发处理的建议
  • EF Core实现事务的几种方式
    • SaveChanges
    • ‌DbContextTransaction
    • TransactionScope
    • 对于事务处理的建议
  • 总结


前言

EF Core相比大家都听说过,它是 .NET Core 中的一个开源对象关系映射(ORM)框架。它允许开发者以面向对象的方式与数据库进行交互,从而简化了数据库访问的复杂性。EF Core 是 Entity Framework 的跨平台版本,支持 .NET Core 以及 .NET Framework。


EFCore 的优势

  • 提高开发效率:EF Core 使得开发者可以使用 C# 代码表达数据操作,无需编写复杂的 SQL 语句。通过定义实体类和数据库上下文,EF Core 可以自动生成相应的数据库表结构和 SQL 语句。这大大减少了开发过程中编写 SQL 语句的工作量,提高了开发效率。
  • 跨平台支持:EF Core 支持多种数据库系统,如 SQL Server、MySQL、PostgreSQL、SQLite 等。这意味着开发者可以在不同的平台和数据库环境中使用 EF Core,具有很好的可移植性。
  • 强大的查询功能:EF Core 提供了丰富的 LINQ 查询功能,支持复杂的查询操作。通过 LINQ,开发者可以使用 C# 代码编写查询表达式,EF Core 会将其转换为相应的 SQL 语句。这使得查询操作更加直观和灵活。
  • 数据库迁移功能:EF Core 的数据库迁移功能可以帮助开发者安全地更改数据库结构。通过迁移,开发者可以在开发过程中轻松地添加、修改或删除数据库表和字段。这为数据库版本管理和持续集成提供了便利。
    摘录自:itpub博客

SaveChang的作用

EF Core中的SaveChanges方法主要用于将本地缓存中的所有状态变化提交到数据库,确保数据的一致性和完整性‌。当调用DbContext的SaveChanges方法时,EF Core会自动检测所有跟踪的实体变化,并将这些变化应用到数据库中。如果所有操作都成功,则提交事务;如果任何操作失败,则回滚事务,确保数据库状态不变‌

EF Core 查询优化小技巧

使用投影(投影到所需的数据类型)

避免使用 Select(x => x) 来选择所有列,而是仅选择需要的列。这样可以减少数据库和网络传输的数据量。

var results = dbContext.Users.Select(u => new { u.Id, u.Name }).ToList();

延迟加载(Lazy Loading)与显式加载(Eager Loading)

1. 延迟加载:默认情况下,EF Core 会懒加载相关实体。确保只在必要时才使用它,因为过多的懒加载可能导致多次数据库查询。
2. 显式加载:使用 Include 方法显式指定需要加载的相关实体,这可以减少查询次数并提升性能。
var results = dbContext.Users.Include(u => u.Orders).ToList();

使用 AsNoTracking

当你不需要跟踪实体的状态时(例如,只读操作),使用 AsNoTracking() 可以避免 EF Core 为每个实体维护其状态,从而提升性能。

var results = dbContext.Users.AsNoTracking().ToList();

减少客户端评估(Client Evaluation)

确保 LINQ 查询尽可能在数据库服务器上执行,避免将数据拉回客户端再进行过滤或排序。使用 AsEnumerable() 或 AsQueryable() 可能有助于控制这一点。

var results = dbContext.Users.AsQueryable() // 保持查询在服务器端执行.Where(u => u.Age > 30).ToList();

使用合适的索引

确保数据库表有适当的索引。索引可以显著提高查询速度,特别是在执行大量数据筛选、排序或连接操作时。

避免 Select * 和不必要的 Include

只选择需要的列,并避免不必要的 Include 调用。例如,如果只需要用户的基本信息,就不要加载不必要的关联数据

var results = dbContext.Users.Select(u => new { u.Id, u.Name }) // 选择必要的列.ToList();

使用异步查询(Async Queries)

对于需要长时间运行或涉及大量数据的查询,使用异步方法可以避免阻塞主线程,提高应用程序的响应性。

var results = await dbContext.Users.ToListAsync();

分析和优化生成的 SQL 查询

使用 EF Core 的日志功能查看生成的 SQL 查询,并对其进行优化。可以通过设置日志级别为 Information 或 Debug 来查看 SQL 查询。

dbContext.Database.Log = message => Debug.WriteLine(message);

使用批量操作(Batching)和分页(Paging)

对于大数据集,考虑使用分页技术来减少单次查询的数据量,或者使用批量操作来减少数据库操作的次数。

var users = dbContext.Users.Skip((page - 1) * pageSize).Take(pageSize).ToList(); // 分页示例

EF Core中entitystate的作用

  • 跟踪实体变化‌:通过EntityState,EF Core能够跟踪实体对象的状态变化,从而在调用SaveChanges方法时,能够准确地执行相应的数据库操作(如插入、更新或删除)‌
  • 优化性能‌:由于EF Core只会对处于Modified或Added状态的实体执行数据库操作,因此通过合理设置EntityState,可以减少不必要的数据库交互,显著提升系统性能‌
  • 开发简化‌:开发者可以通过EntityState清晰地理解与数据库的交互关系,这不仅降低了出错概率,也提高了开发效率‌

‌EntityState的五种状态及其定义如下‌:

‌Detached(游离状态)‌:实体对象与EF Core的上下文没有任何关系,EF Core不会跟踪它的变化。
‌Unchanged(未更改状态)‌:实体对象被加载到EF Core的上下文中,且自加载后没有发生任何变化。
‌Deleted(已删除状态)‌:实体对象在数据库中存在,但已经被标记为删除。
‌Modified(已修改状态)‌:实体对象在数据库中存在,并且某些属性值已经被修改。
‌Added(已添加状态)‌:实体对象已经被添加到EF Core的上下文中,但还没有被保存到数据库中‌

EF Core中引用属性和导航属性

引用属性‌

引用属性通常用于表示一个实体与另一个实体之间的单向关系。例如,在Blog和Post的关系中,Post实体包含一个引用属性Blog,用于指向其所属的Blog实体。通过这个属性,可以直接访问相关的Blog实体,而不需要通过额外的查询操作‌

导航属性

导航属性用于表示实体之间的双向关系。它们不仅包含对相关实体的引用,还提供了通过这些引用访问相关实体数据的能力。导航属性可以是集合导航属性或引用导航

集合导航属性

用于表示一个实体与多个相关实体的关系。例如,在Person和CarData的关系中,Person实体包含一个集合导航属性Cars,用于存储其拥有的所有CarData实体‌

引用导航属性‌

用于表示一个实体与单个相关实体的关系。例如,在Post和Blog的关系中,Post实体包含一个引用导航属性Blog,用于指向其所属的Blog实体‌

EF Core中如何通过数据生成实体和dbcontext?

EF Core生成实体的方式主要有以下几种:

  • 通过实体类直接实例化
  • 通过查询数据库并映射到实体
  • 使用 FromSql 或 FromSqlRaw 方法直接从数据库查询并映射到实体(高级用法)
  • 使用 DbSet 的 Add 方法自动生成实体(例如,从用户输入或表单数据)

EF Core如何处理并发?

使用乐观并发

乐观并发假定多个事务可以同时发生,并且在提交时检查是否有冲突。在 EF Core 中,这通常通过在模型中使用 rowversion(在 SQL Server 中为 timestamp 类型)或 ConcurrencyToken 属性来实现。
使用 rowversion(timestamp)在 SQL Server 中,你可以直接使用 rowversion 类型作为并发令牌。

public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public byte[] RowVersion { get; set; } // 使用 byte[] 类型对应 rowversion
}

在 EF Core 中配置模型时,不需要做额外配置,EF Core 会自动处理这些字节。使用 ConcurrencyToken;如果你使用的是其他数据库(如 PostgreSQL),你可以使用 ConcurrencyToken 属性。

public class Blog
{public int BlogId { get; set; }public string Url { get; set; }[ConcurrencyCheck]public int? Version { get; set; } // 使用 int? 作为令牌类型
}

异常处理与重试机制

当使用乐观并发时,如果检测到并发冲突,EF Core 会抛出一个 DbUpdateConcurrencyException 异常。你可以通过捕获这个异常并实现重试逻辑来处理这种情况。

try
{db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{// 处理冲突,例如重新加载实体并再次尝试更新或通知用户冲突发生var entry = ex.Entries.Single();var clientValues = entry.CurrentValues;var databaseValues = entry.GetDatabaseValues();if (databaseValues == null){// 数据已被删除,可以选择抛出异常或进行其他处理}else{// 应用任何业务逻辑以决定如何合并数据,例如询问用户或自动合并某些字段等。// 然后重新尝试保存更改。entry.CurrentValues.SetValues(databaseValues); // 可以选择重新加载数据库的值或合并当前值和数据库值。entry.State = EntityState.Modified; // 标记为修改状态以便重试。try{db.SaveChanges(); // 再次尝试保存更改。}catch (DbUpdateConcurrencyException) // 可能需要再次捕获异常以处理可能的再次冲突。{// 处理再次冲突的情况。}}
}

使用悲观锁(悲观并发控制)

虽然 EF Core 主要支持乐观并发控制,但在某些情况下,你可能会需要使用悲观锁来控制并发。这可以通过数据库的特定功能实现,例如 SQL Server 的 SELECT … FOR UPDATE 语句或者使用 WITH (ROWLOCK, UPDLOCK) 提示。但是,在 EF Core 中直接使用这些功能通常需要自定义 SQL 或通过存储过程来实现。例如:

var blogs = db.Blogs.FromSqlRaw("SELECT * FROM Blogs WITH (ROWLOCK, UPDLOCK) WHERE Id = {0}", id).ToList();

对于并发处理的建议

  • 尽早捕获并处理异常:尽早捕获 DbUpdateConcurrencyException 并处理,避免让异常传播到用户界面层。
  • 用户反馈:当检测到并发冲突时,提供清晰的反馈给用户,让他们知道发生了什么以及可能的解决方案。
  • 日志记录:记录并发冲突的详细信息,以便于分析和调试。
  • 测试:在开发过程中充分测试并发场景,确保你的解决方案在各种情况下都能正常工作。

EF Core实现事务的几种方式

SaveChanges

在默认情况下,EF Core的SaveChanges方法支持事务。如果在一次操作中添加或修改了多个实体,SaveChanges会自动处理事务,确保要么所有操作都成功,要么在遇到错误时回滚所有操作,从而保持数据的一致性‌

‌DbContextTransaction

可以通过调用DbContext的Database.BeginTransaction方法来手动开始一个事务。这种方法提供了更细粒度的控制,可以在需要时手动提交或回滚事务。使用Using语句可以确保事务在代码块执行完毕后自动回滚,无需手动调用回滚操作‌

TransactionScope

System.Transactions命名空间下的TransactionScope类提供了更高层次的事务管理。它不仅可以管理数据库事务,还可以管理其他资源的事务。TransactionScope会自动管理事务的提交和回滚,使得代码更加简洁和安全‌

对于事务处理的建议

  • 支付转账、图书馆借书‌等操作需要确保数据的一致性,事务可以保证要么所有操作都成功,要么在遇到错误时全部回滚。
  • 在复杂业务场景中,默认的事务可能无法满足需求,需要手动控制事务的开始、提交和回滚。
  • 使用过滤器(Filters)可以简化事务的管理,通过在ASP.NET Core的Startup.cs中全局注册事务过滤器,可以自动管理所有数据库操作的事务‌

总结

EF Core的相关知识分享到这里就结束了,后面如果还有其他知识会更新在这篇文章中。感谢大家的观看。

相关文章:

EFCore相关知识分享

EFCore相关知识分享 文章目录 EFCore相关知识分享前言EFCore 的优势SaveChang的作用EF Core 查询优化小技巧使用投影(投影到所需的数据类型)延迟加载(Lazy Loading)与显式加载(Eager Loading)使用 AsNoTrac…...

检测网络安全漏洞 工具 网络安全 漏洞扫描 实验

实验一的名称为信息收集和漏洞扫描 实验环境:VMware下的kali linux2021和Windows7 32,网络设置均为NAT,这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录: 1.信息收集的步骤 2.ping命令…...

deepseek + kimi 高效生成PPT

1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi:https://kimi.moonshot.cn/...

JavaWeb学习-Mybatis(增删改查)

(一)Mybatis入门程序 1.创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。(项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖) <dependencies> <!-- mybatis起步依赖 --> <dependency> …...

软考高项(二十四)法律法规和标准规范 ★重点集萃★

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…...

Django中select_related 的作用

Django中这句代码Dynamic.objects.select_related(song)是什么意思&#xff1f; 在 Django 中&#xff0c;这句代码&#xff1a; Dynamic.objects.select_related(song) 的作用是 在查询 Dynamic 模型的同时&#xff0c;预加载 song 关联的外键对象&#xff0c;从而减少数据…...

vscode无法ssh连接远程机器解决方案

远程服务器配置问题 原因&#xff1a;远程服务器的 SSH 服务配置可能禁止了 TCP 端口转发功能&#xff0c;或者 VS Code Server 在远程服务器上崩溃。 解决办法 检查 SSH 服务配置&#xff1a;登录到远程服务器&#xff0c;打开 /etc/ssh/sshd_config 文件&#xff0c;确保以下…...

计算机组成原理——中央处理器(九)

在每一个清晨醒来&#xff0c;你都有一个全新的机会去塑造你的世界。无论昨日经历了多少风雨&#xff0c;今天的你依旧可以启航向梦想的彼岸。生活或许会给你设置障碍&#xff0c;但请相信&#xff0c;这些都是通往成功的垫脚石。不要让短暂的困境遮蔽了你的视野&#xff0c;因…...

网页版贪吃蛇小游戏开发HTML实现附源码!

项目背景 贪吃蛇是一款经典的休闲小游戏&#xff0c;因其简单易玩的机制和丰富的变形而深受玩家喜爱。本次开发目标是实现一款网页版贪吃蛇小游戏&#xff0c;并通过前端与后端结合的方式&#xff0c;提供一个流畅的在线体验。 实现过程 游戏逻辑设计 蛇的移动&#xff1a;…...

基于java ssm springboot选课推荐交流平台系统设计和实现

基于JavaWeb开发的 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&…...

Sigma-Aldrich化学品安全技术说明书(SDS)查询教程

在当今的现代工业体系里&#xff0c;化学品的应用极为广泛&#xff0c;贯穿于众多行业的生产环节。以电子、皮革、玩具、工艺品、家具制造等行业为例&#xff0c;有机溶剂的使用频率颇高&#xff0c;这虽极大地推动了生产的发展&#xff0c;却也埋下了风险隐患。在这些企业中&a…...

嵌入式实训室解决方案(2025年最新版)

一、背景概述 随着信息技术的迅猛进步&#xff0c;嵌入式系统已成为智能化设备与应用的核心驱动力&#xff0c;引领产业变革与创新。其应用范围广泛&#xff0c;涵盖智能家居、智能医疗、工业控制、交通及网络通信等领域&#xff0c;是信息化与智能化转型的关键。在此背景下&am…...

Spring Cloud — 深入了解Eureka、Ribbon及Feign

Eureka 负责服务注册与发现&#xff1b;Ribbon负责负载均衡&#xff1b;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作&#xff0c;共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理&#xff1a; 一致性&#xff08;Consistency&#xff09;&am…...

全排列(力扣46)

这道题让我们求这个集合有多少种排列方式&#xff0c;那么与之前组合问题的不同就在于要考虑元素之间的顺序了&#xff0c;所以每一层递归的or循环的起始值无需变量控制&#xff0c;都从0开始。但是一个排列中不能出现相同元素&#xff0c;所以别忘了去重&#xff0c;这里的去重…...

Mac部署Jenkins 一

Mac部署Jenkins 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeBrew …...

附录1:组维英文简写大全

附录1&#xff1a;组维英文简写大全 中央处理器 一、技术与厂商 FSB 前端总线频率 HT 超线程技术 Intel 英特尔 AMD 美国超微 VIA 威盛 二、CPU插座 Slot 针插式 ZIF 零插拔力的插座 Socket 触点式 LGA &#xff08;IntelCPU封装形式名称&#xff09; 三…...

SQL Server:查看内存使用情况

目录标题 **1. 使用系统视图和动态管理视图****查看 SQL Server 进程的内存使用情况****查看系统级别的内存使用情况****查看 SQL Server 内存管理器的状态** **2. 使用性能监视器&#xff08;PerfMon&#xff09;****添加内存使用情况计数器** **3. 使用 DBCC MEMORYSTATUS 命…...

chrome-mojo C++ Bindings API

概述 Mojo C 绑定 API 利用C 系统 API提供一组更自然的原语&#xff0c;用于通过 Mojo 消息管道进行通信。结合从Mojom IDL 和绑定生成器生成的代码&#xff0c;用户可以轻松地跨任意进程内和进程间边界连接接口客户端和实现。 本文档通过示例代码片段提供了绑定 API 用法的详…...

uniapp + vite + 使用多个 ui 库

样式冲突 新建了个项目 安装多个 ui 库 发现 uview-plus 和 Ant Design Vue 3.2.20 的 按钮样式 冲突uvuew-plus 的按钮样式 会被 ant 的样式给覆盖解决方式 找到圆满 ant.css 注释 button, html [type"button"], [type"reset"], [type"submit&quo…...

Unity3D 制作动画的时间轴管理方案: Timeline编

在 Unity3D 中使用 Timeline 实现所见即所得(WYSIWYG)的动画制作,合理的项目设置、资源管理和工作流程优化。以下基于本人实践之最佳方案总结: 1. 项目与场景设置 渲染模式与分辨率 在 Game 视图中选择与目标平台匹配的分辨率和屏幕比例(如 16:9 或 4:3),确保编辑时预览…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...