.NET 开源 EF Core 批处理扩展工具
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
前言Entity Framework Core(EF Core)作为 .NET 生态系统中受欢迎的对象关系映射器(ORM),其轻量级、可扩展性和支持多个数据库引擎而备受青睐。 本文将介绍一款.NET 的开源 EF Core 批处理扩展工具,它极大地提升了数据处理的效率和性能。来看看如何轻松集成到我们现有的 EF Core 项目中。 EFCore.BulkExtensionsEntity 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 转自https://www.cnblogs.com/1312mn/p/18431976 该文章在 2024/10/11 8:53:41 编辑过 |
关键字查询
相关文章
正在查询... |