EF 高效批量更新

news/2025/2/28 9:28:59/文章来源:https://www.cnblogs.com/MrChuJiu/p/18702801

介绍

在处理大量数据时,Entity Framework 的默认更新机制可能会导致性能问题。每次调用 SaveChanges 方法时,EF 都会将更改发送到数据库,这对于单个或少量实体的更新是高效的,但对于大量数据的更新或删除操作,可能会变得低效。本文将介绍 Entity Framework 7 引入的两种新方法——ExecuteDeleteExecuteUpdate,它们可以显著提高批量更新的性能。

Entity Framework 的默认行为

Entity Framework 旨在为大多数用例提供高效的变更跟踪。它只发送已更改属性或关系的更新,并智能地批量处理更新以减少数据库往返。所有更改都会无缝同步到 DB 上下文和数据库中。

但如果你需要执行大量更新或删除操作呢?你需要从数据库中加载所有实体,更改它们,然后保存更改。对于大量数据,这可能会产生性能问题。

新批量更新方法

ExecuteDelete

ExecuteDelete 方法允许你直接在数据库中删除实体,而无需将它们加载到内存中。这可以显著提高性能,尤其是当需要删除大量记录时。

以下是一个使用 ExecuteDelete 的示例:

    .Where(p => p.StockQuantity == 0).ExecuteDeleteAsync();

这条代码将生成以下 SQL:

DELETE FROM[p]FROM [Products] AS[p]WHERE[p].[StockQuantity] = 0

ExecuteUpdate

ExecuteUpdate 方法允许你直接在数据库中更新实体,而无需将它们加载到内存中。这可以显著提高性能,尤其是当需要更新大量记录时。
以下是一个使用 ExecuteUpdate 的示例:

.Where(p=>p.Category=="iPhone").ExecuteUpdateAsync(p=>p.SetProperty(x=>x.StockQuantity,0));

这条代码将生成以下 SQL:

UPDATE[p]SET[p].[StockQuantity] = 0FROM[Products] AS[p]WHERE[p].[Category] = N'iPhone'

使用场景与性能优势

ExecuteDelete 和 ExecuteUpdate 方法特别适合以下场景:

  • 需要对大量记录进行更新或删除操作。
  • 不需要将实体加载到内存中,从而节省内存和减少数据库往返。
  • 需要快速执行更新操作,而不必等待 SaveChanges 方法的调用。
    这些方法可以显著提高性能,尤其是在处理大量数据时。

限制与注意事项

限制与注意事项
尽管 ExecuteDelete 和 ExecuteUpdate 的使用非常简单,但需要注意它们的限制:

  • 这些方法的多次调用不能批量处理。每次调用都会向数据库发送一个单独的操作。
  • Entity Framework 不会为这些方法创建隐式事务,就像 SaveChanges 方法那样。因此,如果你有多个批量更新操作,并且希望在一个事务中执行它们,你需要显式地开始一个事务。
  • 执行 ExecuteDelete 或 ExecuteUpdate 后,Entity Framework 不会同步更改。因此,不建议将它们与 SaveChanges 调用混合使用。
  • SaveChanges 提供并发控制。由于 ExecuteDelete 和 ExecuteUpdate 不涉及变更跟踪器,因此它们不支持并发控制。但它们会返回受影响的行数。
  • 这些方法只针对一个表。你不能删除或更新关系。因此,如果你想从两个相关表中删除记录,你需要先删除依赖项,然后再删除主项。
  • 只有关系型数据库提供程序支持这些方法。

拥有类型的支持

在 Entity Framework 8 中,ExecuteUpdate 和 ExecuteDelete 方法得到了增强,现在可以支持拥有类型(Owned Types)。
以下是一个示例,展示如何在拥有类型上使用 ExecuteUpdate:

publiclongIdget;set;publicstringNameget;set;publicPriceInfoPriceInfoget;set;publicstringCategoryget;set;publicintStockQuantityget;set;publicclassPriceInfopublicdecimalPriceget;set;publicstringCurrencyget;set;

配置实体:

modelBuilder.Entity<Product>().OwnsOne(p=>p.PriceInfo);

以下是一个使用 ExecuteUpdate 更新拥有类型的示例:

.Where(p=>p.Category=="iPhone15").ExecuteUpdateAsync(p=>p.SetProperty(x=>x.PriceInfo.Price,799).SetProperty(x=>x.StockQuantity,1000));

生成的 SQL 如下:

UPDATE Products AS pSET p.PriceInfo_Price = 799.0SELECT 1FROM Products AS pWHERE p.Category == N'iPhone 15'

总结

Entity Framework 7 引入的 ExecuteDelete 和 ExecuteUpdate 方法可以显著提高批量更新操作的性能。然而,了解它们的限制对于高效使用它们至关重要。通过合理使用这些方法,你可以显著提升应用程序在处理大量数据时的性能。

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

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

相关文章

No.24 CSS--CSS3新特性(圆角、阴影、动画、媒体查询)

主要内容:圆角 阴影 动画一、圆角(border-radius)<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div{width: 50…

全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程序,新手也能快速上手!

大家好,我是狂师。 在当今数字化时代,智能客服已成为提升用户体验、提高运营效率的关键工具。 今天,我们将为大家带来一个超级简单的教程,教你如何在短短3分钟内,利用腾讯微搭平台,将满血 DeepSeek R1接入到微信、公众号、小程序,打造属于自己的 AI 智能客服,哪怕你是新…

20250228

1. PVC 谨慎多

7.5.1 训练深层网络

当网络很深的时候会出现下面的问题梯度消失是一般情况,所以上面讨论的是梯度消失的情况(每一层的梯度都很小,很多个很小的数相乘就会导致底部的层梯度比上面的层的梯度小);梯度爆炸是另外一回事 之所以会导致上面这种情况是因为不同层之间数据分布是有差别的。所以一个简单…

还在为内外网文件传输头疼?6个方法帮你轻松搞定!

在当今数字化办公时代,内外网文件传输已成为企业日常运营中不可或缺的一环。无论是跨国公司的分部协作,还是企业与外部合作伙伴的数据共享,高效、安全的内外网文件传输都至关重要。 然而,在实际操作中,企业往往会面临诸多挑战: 1、网络隔离,传输不便: 出于安全考虑,企…

迎接自然语言交互时代:Datafocus 助您轻松集成智能问答

随着大型语言模型 (LLM) 能力的飞跃和日益普及,我们正在迈入一个全新的计算时代。自然语言交互不再是科幻小说中的场景,而是真真切切地走进了我们的工作和生活。可以预见,自然语言交互将进入到软件应用的方方面面,而智能问答功能也将成为所有软件的“标配”。 LLM 驱动的自…

基于控制台的c++的贪吃蛇游戏修改

来源同学代码运行环境+运行结果的截图运行环境:c++ 代码#include <conio.h> // 用于 _kbhit 和 _getch #include <windows.h> // 用于 Sleep #include <vector>using namespace std;// 定义方向 enum Direction { STOP = 0, LEFT, RIGHT, UP, DOWN };class…

厦大也来指导啦,厦门大学DeepSeek手册Ⅰ、Ⅱ一同放出!

随着春节DeepSeek的发布震撼全球,也标志着人工智能大模型进入了"惠普"时代,DeepSeek等各类大模型开始逐渐参与到我们的工作、学习以及生活的方方面面,因此更好的了解和使用大模型成为了必修课;目前各大企业和高校也都搭建起来自己的大模型平台,并且推出了使用指…

读DAMA数据管理知识体系指南07数据架构(上)

数字化转型推动各行业变革,数据架构成为关键,包括业务、应用、技术架构等,旨在优化系统功能和用户体验,数据架构师需确保数据与企业战略一致,设计满足长期需求的数据结构和规划。1. 浪潮 1.1. 第一波浪潮是银行和金融交易 1.2. 第二波浪潮是各种数字服务交互 1.3. 在第三波…

Token 无感刷新:打造无缝用户体验与坚实安全防线

一、前言 在前端开发中,用户身份认证通常通过 Token 来实现。然而,Token 的有效期是有限的,过期后用户需要重新登录,这会影响用户体验。为了解决这个问题,Token 无感刷新成为了一种常见的优化方案。 本文将详细介绍如何实现 Token 无感刷新,并探讨其在高并发场景下的优化…

入侵检测系统搭建实验操作手册

一、实验目的 (1)掌握snort入侵检测系统环境搭建和使用。 (2)了解入侵检测工作原理和应用。 二、实验环境实验所需器材: (1)两台PC主机 (2)两根网线 三、实验配置 (1)操作系统:主机A操作系统Windows系统。 (2)软件配置:主机A需要使用到的软件主要有:MobaXterm。…

【帝国CMS8.0】抢先体验,如何提升安全防护能力

关键词:# 帝国CMS系统帝国CMS作为一款非常知名的CMS系统,因其功能强大、结构清晰,深受广大用户喜欢。帝国软件官方于2025-01-18正式发布了“帝国CMS8.0测试版”,让帝国CMS爱好者再一次狂热。 帝国CMS经历过19个版本更新,8.0是第20个版本。帝国CMS7.5版让系统全面完善,功能…