.NET 開源 EF Core 批處理擴展工具
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
前言Entity Framework Core(EF Core)作為 .NET 生態(tài)系統(tǒng)中受歡迎的對象關(guān)系映射器(ORM),其輕量級、可擴展性和支持多個數(shù)據(jù)庫引擎而備受青睞。 本文將介紹一款.NET 的開源 EF Core 批處理擴展工具,它極大地提升了數(shù)據(jù)處理的效率和性能。來看看如何輕松集成到我們現(xiàn)有的 EF Core 項目中。 EFCore.BulkExtensionsEntity Framework Core (EF Core) 批量擴展庫提供了支持批量復(fù)制功能的工具,適用于 .NET 平臺上的插入、更新、刪除、讀?。–RUD)、清空表(Truncate)以及保存更改(SaveChanges)等操作。 該庫支持 SQL Server、PostgreSQL、MySQL 和 SQLite 數(shù)據(jù)庫。 該庫輕量且高效,涵蓋了常用的 CRUD 操作,并被微軟評為推薦的前 20 個 EF Core 擴展之一。 版本說明內(nèi)部機制SQL Server:使用 SqlBulkCopy 進行插入操作,更新和刪除操作則結(jié)合了 BulkInsert 和原生 SQL 的 MERGE。 SQLite:由于沒有 BulkCopy,該庫使用純 SQL 結(jié)合 UPSERT。 注意事項批量測試:不能使用 UseInMemoryDb,因為 InMemoryProvider 不支持特定的關(guān)系數(shù)據(jù)庫方法。 如何使用?首先使用 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 身份驗證,則連接字符串中應(yīng)包含 Trusted_Connection=True,因為 SQL 身份驗證信息需要保留在連接中。 事務(wù)管理每個批量操作默認作為單獨的事務(wù)處理,并自動提交。如果需要在一個過程中執(zhí)行多個操作,則應(yīng)顯式使用事務(wù)。 例如,由于子表不會自動與父表一起插入,因此需要顯式進行第二次調(diào)用: using (var transaction = context.Database.BeginTransaction()) { context.BulkInsert(entitiesList); context.BulkInsert(subEntitiesList); transaction.Commit(); } 批量插入或更新BulkInsertOrUpdate 方法適用于需要在同一數(shù)據(jù)庫連接中執(zhí)行插入或更新操作的場景。當主鍵(Primary Key)匹配時執(zhí)行更新,否則執(zhí)行插入。 批量插入、更新或刪除BulkInsertOrUpdateOrDelete 方法有效地同步表中的行與輸入數(shù)據(jù)。不在輸入列表中的數(shù)據(jù)庫記錄將被刪除。 批量讀取BulkRead 方法基于一個或多個唯一列執(zhí)行 SELECT 和 JOIN 操作,這些列在配置的 UpdateByProperties 中指定。 示例 using (var transaction = context.Database.BeginTransaction()) { // 插入或更新主表 context.BulkInsertOrUpdate(mainEntitiesList); // 插入或更新子表 context.BulkInsertOrUpdate(subEntitiesList); // 提交事務(wù) transaction.Commit(); } // 同步表行與輸入數(shù)據(jù) context.BulkInsertOrUpdateOrDelete(allEntitiesList); // 根據(jù)唯一列讀取數(shù)據(jù) context.BulkRead(uniqueColumnsConfig); 性能測試結(jié)果以下是在 SQL Server 2019 上進行的性能測試結(jié)果(單位:秒): 測試配置硬件配置:Intel i7-10510U CPU @ 2.30GHz, DDR3 16GB, SSD Samsung 512GB 測試表結(jié)構(gòu):測試表 TestTable 包含 6 列(Guid, string x2, int, decimal?, DateTime),所有列均被插入,其中 2 列被更新 性能對比注意事項小數(shù)據(jù)集開銷:對于較小的數(shù)據(jù)集(少于 1000 行),由于大多數(shù)批量操作需要創(chuàng)建臨時表并在完成后刪除臨時表,因此會有一定的開銷。 建議:建議對于大于 1000 行的數(shù)據(jù)集使用批量操作以獲得最佳性能。 項目地址https://github.com/borisdj/EFCore.BulkExtensions 轉(zhuǎn)自https://www.cnblogs.com/1312mn/p/18431976 該文章在 2024/10/11 8:53:41 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |