Entity Framework Core 7中高效地进行批量数据插入

因为之前的版本中,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数据库。

性能对比

我用SQLServer数据库做了一下插入10万条数据的测试,用AddRange插入耗时约21秒,而用我这个开源项目进行插入耗时只有约5秒。

项目用法

这个库的旧版也支持.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技术内幕与项目实战》,这本书的宗旨就是“讲微软文档中没有的内容,讲原理、讲实践、讲架构”。感兴趣请看右侧公告。

 

posted @ 2022-12-01 10:09  杨中科  阅读(4089)  评论(15编辑  收藏  举报