因為之前的版本中,EF Core無法實現高效地批量插入、修改、刪除數據,所以我開發了Zack.EFCore.Batch這個開源項目,比較受大家的歡迎,獲得了400多個star。
從.NET 7開始,微軟在Entity Framework Core 7內置了對高效地批量修改、刪除數據的支持,詳細請見這個文檔 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因此我的這個開源項目在.NET 7中將不再提供對批量修改、刪除數據的支持。但是由于Entity Framework Core中仍然沒有提供高效地批量插入數據的功能,因此我把這個開源項目升級到.NET 7,從而繼續為EF Core提供高效地批量插入數據的功能。
為什么開發這個功能?
Entity Framework Core中可以通過AddRange()方法來批量插入數據,但是AddRange()添加的數據仍然是被逐條執行Insert語句來插入到數據庫中的,執行效率比較低。我們知道,我們可以通過SqlBulkCopy來快速地插入大量的數據到SQLServer數據庫,因為SqlBulkCopy是把多條數據打成一個數據包發送到SQLServer的,所以插入效率非常高。MySQL、PostgreSQL等也有類似的支持。
當然,直接使用SqlBulkCopy來進行數據插入需要程序員把數據填充到DataTable,而且需要進行列的映射等操作,還需要處理ValueConverter等問題,用起來比較麻煩。因此我對這些功能封裝,從而讓EF Core的開發者能夠更方便的以面向模型的方式來插入數據。
這個庫目前支持MS SQLServer、MySQL、PostgreSQL數據庫。
項目用法
這個庫的舊版也支持.NET 5、6等版本,具體用法見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
然后就可以使用這個開源項目為DbContext提供的的擴展方法BulkInsert來進行數據的批量插入了,代碼如下:
List<Book> books = new List<Book>();
for (int i = 0; i < 100; i++)
{books.Add(new Book { AuthorName = "abc" + i, Price = new Random().NextDouble(), PubTime = DateTime.Now, Title = Guid.NewGuid().ToString() });
}
using (TestDbContext ctx = new TestDbContext())
{ctx.BulkInsert(books);
}
開源項目地址:https://github.com/yangzhongke/Zack.EFCore.Batch
希望這個庫能幫到大家。
歡迎閱讀我編寫的《ASP.NET Core技術內幕與項目實戰》,這本書的宗旨就是“講微軟文檔中沒有的內容,講原理、講實踐、講架構”。