Entity Framework Core 7中高效地進(jìn)行批量數(shù)據(jù)插入
因?yàn)橹暗陌姹局?,EF Core無(wú)法實(shí)現(xiàn)高效地批量插入、修改、刪除數(shù)據(jù),所以我開(kāi)發(fā)了Zack.EFCore.Batch這個(gè)開(kāi)源項(xiàng)目,比較受大家的歡迎,獲得了400多個(gè)star。
從.NET 7開(kāi)始,微軟在Entity Framework Core 7內(nèi)置了對(duì)高效地批量修改、刪除數(shù)據(jù)的支持,詳細(xì)請(qǐng)見(jiàn)這個(gè)文檔 https://learn.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-7.0/whatsnew?WT.mc_id=DT-MVP-5004444#executeupdate-and-executedelete-bulk-updates 因此我的這個(gè)開(kāi)源項(xiàng)目在.NET 7中將不再提供對(duì)批量修改、刪除數(shù)據(jù)的支持。但是由于Entity Framework Core中仍然沒(méi)有提供高效地批量插入數(shù)據(jù)的功能,因此我把這個(gè)開(kāi)源項(xiàng)目升級(jí)到.NET 7,從而繼續(xù)為EF Core提供高效地批量插入數(shù)據(jù)的功能。
為什么開(kāi)發(fā)這個(gè)功能?
Entity Framework Core中可以通過(guò)AddRange()方法來(lái)批量插入數(shù)據(jù),但是AddRange()添加的數(shù)據(jù)仍然是被逐條執(zhí)行Insert語(yǔ)句來(lái)插入到數(shù)據(jù)庫(kù)中的,執(zhí)行效率比較低。我們知道,我們可以通過(guò)SqlBulkCopy來(lái)快速地插入大量的數(shù)據(jù)到SQLServer數(shù)據(jù)庫(kù),因?yàn)镾qlBulkCopy是把多條數(shù)據(jù)打成一個(gè)數(shù)據(jù)包發(fā)送到SQLServer的,所以插入效率非常高。MySQL、PostgreSQL等也有類(lèi)似的支持。
當(dāng)然,直接使用SqlBulkCopy來(lái)進(jìn)行數(shù)據(jù)插入需要程序員把數(shù)據(jù)填充到DataTable,而且需要進(jìn)行列的映射等操作,還需要處理ValueConverter等問(wèn)題,用起來(lái)比較麻煩。因此我對(duì)這些功能封裝,從而讓EF Core的開(kāi)發(fā)者能夠更方便的以面向模型的方式來(lái)插入數(shù)據(jù)。
這個(gè)庫(kù)目前支持MS SQLServer、MySQL、PostgreSQL數(shù)據(jù)庫(kù)。
項(xiàng)目用法
這個(gè)庫(kù)的舊版也支持.NET 5、6等版本,具體用法見(jiàn)https://github.com/yangzhongke/Zack.EFCore.Batch ,下面只講.NET 7中的用法。
首先,安裝Nuget包:
SQLServer用戶: Install-Package Zack.EFCore.Batch.MSSQL_NET7
MySQL用戶: Install-Package Zack.EFCore.Batch.MySQL.Pomelo_NET7
Postgresql用戶: Install-Package Zack.EFCore.Batch.Npgsql_NET7
然后就可以使用這個(gè)開(kāi)源項(xiàng)目為DbContext提供的的擴(kuò)展方法BulkInsert來(lái)進(jìn)行數(shù)據(jù)的批量插入了,代碼如下:
開(kāi)源項(xiàng)目地址: https://github.com/yangzhongke/Zack.EFCore.Batch
希望這個(gè)庫(kù)能幫到大家。
歡迎閱讀我編寫(xiě)的《ASP.NET Core技術(shù)內(nèi)幕與項(xiàng)目實(shí)戰(zhàn)》,這本書(shū)的宗旨就是“講微軟文檔中沒(méi)有的內(nèi)容,講原理、講實(shí)踐、講架構(gòu)”。
