4

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

 2 years ago
source link: https://www.cnblogs.com/rupeng/p/16940576.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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秒。

130406-20221201104224289-1988756012.png

项目用法

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


Recommend

  • 18
    • developer.51cto.com 4 years ago
    • Cache

    巧用Dictionary实现日志数据批量插入

    背景 最近再做一个需求,就是对站点的一些事件进行埋点,说白了就是记录用户的访问行为。那么这些数据怎么保存呢,人家点一下保存一下?显然不合适,肯定是需要批量保存,提高效率。 问题窥探 首先,我想到的是Dictionary,对于C...

  • 18

    MySQL 死锁套路:唯一索引下批量插入顺序不一致文章>MySQL 死锁套路:唯一索引下批量插入顺序不一致MySQL 死锁套路:唯一索引下批量插入顺序不一致

  • 15

    MySQL 死锁套路:一次诡异的批量插入死锁问题分析文章>MySQL 死锁套路:一次诡异的批量插入死锁问题分析MySQL 死锁套路:一次诡异的批量插入死锁问题分析

  • 11

    MySQL 批量插入,如何不插入重复数据? 温故而知新 知识这个东西,看来真的要温故而知新,一直不用,都要忘记了。 业务很简单:需要批量插入一些数据,数据来源可能是其他数据库的表...

  • 8

    mysql批量插入时,如何不插入重复数据发布于 今天 13:27 1.insert ignore into example:insert ignore into user (id,name) value(1,'lisi'); 作用:当插入数据存在...

  • 19

    使用influxDB批量插入的时候,报了这个错org.influxdb.InfluxDBException: short write,原因是什么,怎么解决啊...

  • 4

    [TOC] 上周松哥转载了一个数据批量插入的文章,里边和大家聊了一下数据批量插入的问题,批量插入到底怎么做才快。 有个小伙伴看了文章后提出了不同的意见: 松哥认真和 BUG 同学聊了下,基本上明白了这个小伙伴的意思,于是我自己也写了...

  • 6

    EntityFramework中的的高效批量插入 EF虽然是一个功能强大的orm工具,但对高性能的批量插入支持却不咋地,今天就遇到了...

  • 5

    使用MySqlBulkLoader批量插入数据 最近在项目中遇到插入数据瓶颈,几万、几十万、几百万的数据保存到MYSQL数据...

  • 9

    MyBatis批量插入数据优化,那叫一个优雅! 作者:springboot葵花宝典 2023-12-30 20:04:51 我们使用了 mybatis-plus 框架,并采用其中的 saveBatch 方法进行批量数据插入。然而,通过深入研究源码,我发现这个方法...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK