前言

Entity Framework Core(EF Core)作为 .NET 生态系统中受欢迎的对象关系映射器(ORM),其轻量级、可扩展性和支持多个数据库引擎而备受青睐。

本文将介绍一款.NET 的开源 EF Core 批处理扩展工具,它极大地提升了数据处理的效率和性能。来看看如何轻松集成到我们现有的 EF Core 项目中。

EFCore.BulkExtensions

Entity Framework Core (EF Core) 批量扩展库提供了支持批量复制功能的工具,适用于 .NET 平台上的插入、更新、删除、读取(CRUD)、清空表(Truncate)以及保存更改(SaveChanges)等操作。

该库支持 SQL Server、PostgreSQL、MySQL 和 SQLite 数据库。

该库轻量且高效,涵盖了常用的 CRUD 操作,并被微软评为推荐的前 20 个 EF Core 扩展之一。

版本说明

内部机制

SQL Server:使用 SqlBulkCopy 进行插入操作,更新和删除操作则结合了 BulkInsert 和原生 SQL 的 MERGE。

SQLite:由于没有 BulkCopy,该库使用纯 SQL 结合 UPSERT。

注意事项

批量测试:不能使用 UseInMemoryDb,因为 InMemoryProvider 不支持特定的关系数据库方法。

如何使用?

首先使用 Nuget 安装 EFCore.BulkExtensions。

Install-Package EFCore.BulkExtensions  

批量操作示例

context.BulkInsert(entities);
context.BulkInsertOrUpdate(entities);
context.BulkInsertOrUpdateOrDelete(entities);
context.BulkUpdate(entities);
context.BulkDelete(entities);
context.BulkRead(entities);
context.BulkSaveChanges();

异步版本

context.BulkInsertAsync(entities);
context.BulkInsertOrUpdateAsync(entities); //Upsert
context.BulkInsertOrUpdateOrDeleteAsync(entiti);//Sync
context.BulkUpdateAsync(entities);
context.BulkDeleteAsync(entities);
context.BulkReadAsync(entities);
context.BulkSaveChangesAsync();

与 EF Core 使用

// 删除
context.Items.Where(a => a.ItemId > 500).BatchDelete();
context.Items.Where(a => a.ItemId > 500).BatchDeleteAsync(); // 更新
context.Items.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100});
context.Items.Where(a => a.ItemId <= 500).BatchUpdateAsync(a => new Item {Quantity=a.Quantity+100});
// can be as value '+100' or as variable '+incrementStep' (int incrementStep = 100;) // 更新
context.Items.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });
context.Items.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" }); // Truncate
context.Truncate<Entity>();
context.TruncateAsync<Entity>();

批量操作

连接字符串配置

如果使用 Windows 身份验证,则连接字符串中应包含 Trusted_Connection=True,因为 SQL 身份验证信息需要保留在连接中。

事务管理

每个批量操作默认作为单独的事务处理,并自动提交。如果需要在一个过程中执行多个操作,则应显式使用事务。

例如,由于子表不会自动与父表一起插入,因此需要显式进行第二次调用:

using (var transaction = context.Database.BeginTransaction())
{
context.BulkInsert(entitiesList);
context.BulkInsert(subEntitiesList);
transaction.Commit();
}

批量插入或更新

BulkInsertOrUpdate 方法适用于需要在同一数据库连接中执行插入或更新操作的场景。当主键(Primary Key)匹配时执行更新,否则执行插入。

批量插入、更新或删除

BulkInsertOrUpdateOrDelete 方法有效地同步表中的行与输入数据。不在输入列表中的数据库记录将被删除。

批量读取

BulkRead 方法基于一个或多个唯一列执行 SELECT 和 JOIN 操作,这些列在配置的 UpdateByProperties 中指定。

示例

using (var transaction = context.Database.BeginTransaction())
{
// 插入或更新主表
context.BulkInsertOrUpdate(mainEntitiesList); // 插入或更新子表
context.BulkInsertOrUpdate(subEntitiesList); // 提交事务
transaction.Commit();
} // 同步表行与输入数据
context.BulkInsertOrUpdateOrDelete(allEntitiesList); // 根据唯一列读取数据
context.BulkRead(uniqueColumnsConfig);

性能测试结果

以下是在 SQL Server 2019 上进行的性能测试结果(单位:秒):

测试配置

硬件配置:Intel i7-10510U CPU @ 2.30GHz, DDR3 16GB, SSD Samsung 512GB

测试表结构:测试表 TestTable 包含 6 列(Guid, string x2, int, decimal?, DateTime),所有列均被插入,其中 2 列被更新

性能对比

注意事项

小数据集开销:对于较小的数据集(少于 1000 行),由于大多数批量操作需要创建临时表并在完成后删除临时表,因此会有一定的开销。

建议:建议对于大于 1000 行的数据集使用批量操作以获得最佳性能。

项目地址

https://github.com/borisdj/EFCore.BulkExtensions

总结

希望本文能为朋友们在使用EF Core开发方面带来帮助。欢迎大家在评论区留言讨论,分享您的经验和建议。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号[DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

.NET 开源 EF Core 批处理扩展工具,真好用的更多相关文章

  1. EF Core 批处理语句

    在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...

  2. 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]

    上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...

  3. 使用Asp.Net Core MVC 开发项目实践[第三篇:基于EF Core的扩展]

    上篇我们说到了EFCore的基础使用,这篇我们将讲解下基于EFCore的扩展. 我们在Mango.Framework.EFCore类库项目中创建一个类名EFExtended的扩展类,并且引入相关的命名 ...

  4. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  5. C# 数据操作系列 - 5. EF Core 入门

    0.前言 上一章简单介绍了一下ORM框架,并手写了一个类似ORM的工具类.这一章将介绍一个在C#世界里大名鼎鼎的ORM框架--Entity Framework的Core版. Entity Framew ...

  6. Entity Framework (EF) Core工具创建一对多和多对多的关系

     一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...

  7. 【EF Core】Entity Framework Core 批处理语句

    在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...

  8. 开源题材征集 + MVC&EF Core 完整教程小结

    到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...

  9. [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  10. .net core Entity Framework 与 EF Core

    重点讲 Entity Framework Core ! (一)Entity Framework 它是适用于.NET 的对象关系映射程序 (ORM),现在的EF6已经是久经沙场,并经历重重磨难,获得一致 ...

随机推荐

  1. mybatis源码配置文件解析之五:解析mappers标签(解析class属性)

    在上篇文章中分析了mybatis解析mapper标签中的resource.url属性的过程,<mybatis源码配置文件解析之五:解析mappers标签(解析XML映射文件)>.通过分析可 ...

  2. electron安装成功记录

    1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...

  3. windows生成苹果私钥证书p12证书和profile文件的方法

    hbuilderx出现已经有差不多10年时间了,现在越来越多的企业,开始使用跨平台性更优秀的uniapp来开发ios app. 开发ios app的时候,打包需要苹果的私钥证书和证书profile文件 ...

  4. Label Studio数据标注--通过源码安装

    Label Studio是Heartex公司开发的一款在线数据标注工具,分为社区版(开源)和企业版(云服务,收费),企业版提供了增强的安全性(单点登录.角色基于访问控制.SOC2).团队管理.分析和报 ...

  5. 【MySQL】二级MySQL考试 救场帮助表

    周六去考二级,应用第一题就是添加外键约束 草,写了半天老说语法不对,然后急中生智,觉得默认的库里应该有文档说明表 以下是SQL查询过程: -- 猜测是在mysql库里面 mysql> USE m ...

  6. 【SpringBoot】05 探索配置方式 Part1 指定和导入配置的注解

    @PropertySource & @ImportResource @ConfigurationProperties默认从全局配置文件中读取 我们可以拆解出来分成单独的配置文件 [提取Bean ...

  7. 微软的GitHub Copilot

    随着OpenAI的ChatGPT4 Turbo的发布,基于ChatGPT的Copilot也推出了最新版. ======================================= 帮助文档: h ...

  8. 【转载】 Makefile的静态模式%.o : %.c

    版权声明:本文为CSDN博主「猪哥-嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/u012351051 ...

  9. Hutool常用工具类

    1.背景 实际开发中经常用到很多的工具类,这里hutool提供了一系列的工具类,下面重点介绍常用的工具类. 2.使用步骤 官方文档:https://hutool.cn/docs/#/ 添加依赖 < ...

  10. 9组-Beta冲刺-5/5

    一.基本情况(15分) 队名:不行就摆了吧 组长博客:9组-Beta冲刺-5/5 GitHub链接:https://github.com/miaohengming/studynote/tree/mai ...