首页 > 其他分享 >.NET 开源 EF Core 批处理扩展工具,真好用

.NET 开源 EF Core 批处理扩展工具,真好用

时间:2024-09-30 10:47:53浏览次数:8  
标签:Core 批量 插入 EF entities context NET

前言

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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

标签:Core,批量,插入,EF,entities,context,NET
From: https://www.cnblogs.com/1312mn/p/18431976

相关文章

  • [.NET Blog] .NET Aspire 测试入门
    https://devblogs.microsoft.com/dotnet/getting-started-with-testing-and-dotnet-aspire/自动化测试是软件开发的重要一环。它可以帮助我们尽早确认软件中的缺陷和防止回归问题。在本文中,我们将探讨如何在.NETAspire中开始测试,支持我们进行跨分布式应用的测试场景。测试分......
  • 转载 fastapi 部署 原文链接:https://blog.csdn.net/FrenzyTechAI/article/details/132
    sudoadd-apt-repositoryppa:deadsnakes/ppasudoaptupdatesudoaptinstallpython3.12python3.12-venv-ysudoaptinstallsupervisorsudoaptinstallsupervisornginx-y启用并启动Supervisor:sudosystemctlenablesupervisorsudosystemctlstartsupervisor使用ena......
  • 实战 vSphere 7 vMotion 迁移说明 ( Vcenetr 内迁移、 跨vcenter 迁移)
    目录一、vMotion简介二、Vcenter内虚拟机迁移2.1无共享存储的环境中的vMotion具有以下要求和限制2.2网卡启用vMotion​编辑2.3右键单击虚拟机,然后选择迁移2.4选择更改计算资源和存储2.5选择虚拟机的目标资源2.6选择虚拟机磁盘格式2.7选择虚拟机存储策略2.......
  • Codeforces Round 976 (Div. 2)
    B:很容易发现只有因数个数为偶数的灯泡是亮的。所以只有完全平方数的因数是奇数个。实现上可以二分。但是sqrt是double的必须开sqrtl才是longdouble的,才能满足这题longlong的数据范围。人给我卡傻了。哈哈。#include<bits/stdc++.h>usingnamespacestd;#defineintunsign......
  • 转载 https://blog.csdn.net/h1773655323/article/details/142098658#:~:text=%E7%94%
    在Ubuntu20.04上安装Python3.12:详细教程写bug如流水于2024-09-1014:41:34发布阅读量837收藏11点赞数4分类专栏:Python文章标签:ubuntupythonlinux版权Python专栏收录该内容53篇文章7订阅订阅专栏今天这篇文章将指导您如何在Ubuntu20.04上安装Python3.12......
  • Singularity 2 - 400个大气史诗电影预告片/轰隆声/风声/上升/张力/呼啸声/嗡嗡声/暗淡
    SINGULARITY2–CINEMATICSOUNDEFFECTSLIBRARY广受赞誉的电影音效库SINGULARITY的后续更新作品。电影人必须拥有的音效库。Singularity2包括400个原始声音,旨在帮助您创建惊人的电影电影。特性–400个原创音效–专业的掌握–全部为WAV格式(1.2GB)–兼容任......
  • 【Java】—— 常用类和基础API:JDK8之前日期时间API的使用:Date、SimpleDateFormat、Cal
    目录3.JDK8之前:日期时间API3.1java.lang.System类的方法3.2java.util.Date3.3java.text.SimpleDateFormat3.4java.util.Calendar(日历)练习3.JDK8之前:日期时间API3.1java.lang.System类的方法System类提供的publicstaticlongcurrentTimeMillis():用来返......
  • 《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中
    文章目录一、迁移学习的简单介绍1.迁移学习是什么?2.迁移学习的步骤二、数据集介绍三、代码实现1.步骤2.所用到方法介绍的文章链接3.完整代码一、迁移学习的简单介绍1.迁移学习是什么?迁移学习是指利用已经训练好的模型,在新的任务上进行微调。迁移学习可以加快模......
  • Github_以太网开源项目verilog-ethernet代码阅读与移植(五)
    实验背景在(四)中介绍了Github开源项目verilog-ethernet的移植思路,以及对MII接口和数据链路层等功能的仿真,下面介绍数据的跨时钟域传输,以太网数据传输过程和网络层数据传输相关的移植。实验内容数据的跨时钟域传输处理,以太网数据传输过程和网络层数据传输模块介绍与仿真。......
  • .NET|--WPF|--笔记合集|--依赖项属性|--5.附加属性
    前言附加属性是一个ExtensibleApplicationMarkupLanguage(XAML)概念。附加属性允许为派生自DependencyObject的任何XAML元素设置额外的属性/值对,即使该元素未在其对象模型中定义这些额外的属性。额外的属性可进行全局访问。附加属性通常定义为没有常规属性包装......