• 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 books = new List();
    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技术内幕与项目实战》,这本书的宗旨就是“讲微软文档中没有的内容,讲原理、讲实践、讲架构”。感兴趣请看右侧公告。

     

  • 相关阅读:
    软件设计模式系列之六——单例模式
    蓝桥杯2024年第十五届省赛
    基础:如何写好一篇学术论文?
    C# OpenVINO Cls 图像分类
    【无标题】
    Ipython和Jupyter Notebook介绍
    WOFOST模型与PCSE模型实践技术应用
    类模板Array带二个模板参数
    失业在家的6个月,我通过外包全款买了房:你看不起的行业,往往很赚钱
    弹性布局 单选
  • 原文地址:https://www.cnblogs.com/rupeng/p/16940576.html