首页 > 其他分享 >第三十一节:批量插入框架[Zack.EFCore.Batch]和EFCore8.x自带的批量删除、更新

第三十一节:批量插入框架[Zack.EFCore.Batch]和EFCore8.x自带的批量删除、更新

时间:2024-04-16 10:56:54浏览次数:26  
标签:Zack 批量 db Batch var new 删除

一.  说明

1. 目标

  这里主要测试 EFCore8.x 版本提供的批量删除 和 批量更新; 以及老杨的框架 [Zack.EFCore.Batch]

  以SQLServer为载体进行测试。

2. 准备

(1). 需要的程序集

   必须的程序集:    Microsoft.EntityFrameworkCore.Tools

   EF自身的程序集: Microsoft.EntityFrameworkCore.SqlServer

PS:【Microsoft.EntityFrameworkCore.SqlServer】:用来连接SQLServer数据库,里面包含【Microsoft.EntityFrameworkCore.Relational】,而它里面又包含:【Microsoft.EntityFrameworkCore】

(2). 常用指令

  A.全表的首次映射:

【Scaffold-DbContext "Server=localhost;Database=EFCore6xDB;User ID=sa;Password=123456;Encrypt=true;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer  -OutputDir Models -Context EFCore8xDBContext -UseDatabaseNames -DataAnnotations -NoPluralize】

 特别注意:

   ① 需要加上 Encrypt=true;TrustServerCertificate=true;  否则映射会报证书错误  (Encrypt=true; 可以不加)

   ② 个人倾向注释掉 <Nullable>enable</Nullable> 再生成

 

二.  批量插入框架

1. 说明

 该组件对于EF8.x仅支持批量插入操作了,批量更新、批量删除已经删除,推荐使用官方EF8.x提供的

 下面以SQLServer来测试

注:On mysql, to use BulkInsert, please enable local_infile on server side and client side: enable "local_infile=ON" on mysql server,and add "AllowLoadLocalInfile=true" to connection string on client side.

 支持三种数据库:
     SQLServer: Install-Package Zack.EFCore.Batch.MSSQL_NET8
     MySQL: Install-Package Zack.EFCore.Batch.MySQL.Pomelo_NET8
     Postgresql: Install-Package Zack.EFCore.Batch.Npgsql_NET8
 注:
   在 mysql中, 如果使用BulkInsert,请在服务器端和客户端都启用local_infile:在mysql server服务器端
   启用"local_infile=ON",然后在连接字符串中添加 "AllowLoadLocalInfile=true"。

2. 实操

 (1). 通过Nuget安装程序集 【Zack.EFCore.Batch.MSSQL_NET8】

 (2). 不需要在 OnConfiguring中做任何配置了

 (3). 调用BulkInsert方法批量插入即可

{
    var userList = new List<UserInfo>();
    for (int i = 0; i < 10000; i++)
    {
        userList.Add(new UserInfo()
        {
            id = Guid.NewGuid().ToString("N"),
            userName = "ypf" + i,
            userPwd = "test" + i,
            userGender = "男",
            userAge = i,
            addTime = DateTime.Now,
            delflag = 0
        });
    }

    var db = new EFCore7xDBContext();
    db.BulkInsert(userList);

    Console.WriteLine("插入成功");

}

 

3. 性能测试

  10w条数据,使用官方的AddRange() 大约21s,使用该框架大约 5s

 

三. 批量删除、更新

1. 说明

  删除:使用EFCore8.x自定的 ExecuteDelete 或 ExecuteDeleteAsync 方法

  更新:使用EFCore8.x自定的 ExecuteUpdate 或 ExecuteUpdateAsync 方法

 

2. 批量删除实操

  详见代码

{
    var db = new EFCore8xDBContext();
    var count = db.UserInfo.Where(u => u.userName.Contains("2")).ExecuteDelete();
    Console.WriteLine($"删除了{count}条数据");
}

  生成SQL语句如图1

 

 3. 批量更新实操

  详见代码

{
    var db = new EFCore8xDBContext();
    var count = db.UserInfo.Where(u => u.userName.EndsWith("3"))
                .ExecuteUpdate(u => u.SetProperty(u => u.userPwd, "123456")
                                     .SetProperty(u => u.userAge, u => u.userAge + 100000)
                               );
    Console.WriteLine($"删除了{count}条数据");
}

  生成SQL语句如图2

 

4. 事务操作

  批量插入不能放到事务中,直接报错,Unexpected existing transaction

  批量更新和批量删除可以放到事务中

查看代码
{
    using var db = new EFCore8xDBContext();
    using (var transaction = db.Database.BeginTransaction())
    {
        try
        {
            //1. 批量插入【不能放到事务里,直接报错,Unexpected existing transaction.】
            //List<UserInfo> userList = new();
            //for (int i = 1; i <= 4; i++)
            //{
            //    UserInfo user = new UserInfo()
            //    {
            //        id = Guid.NewGuid().ToString("N"),
            //        userName = "ypf1_" + i,
            //        userPwd = "123456",
            //        userAge = 19,
            //        userGender = "男",
            //        addTime = DateTime.Now,
            //        delflag = 0
            //    };
            //    userList.Add(user);
            //}
            //await db.BulkInsertAsync(userList);


            //2-批量删除【可以放到事务里】
            var count1 = db.UserInfo.Where(u => u.userName.Contains("2")).ExecuteDelete();


            //3. 批量修改 【可以放到事务里】
            var count2 = db.UserInfo.Where(u => u.userName.EndsWith("3"))
                        .ExecuteUpdate(u => u.SetProperty(u => u.userPwd, "123456")
                                             .SetProperty(u => u.userAge, u => u.userAge + 100000)
                                       );


            //4. 模拟错误
            UserInfo user2 = new()
            {
                id = Guid.NewGuid().ToString("N") + "354545",  //模拟错误
                userName = "ypf2_",
                userPwd = "123456",
                userAge = 19,
                userGender = "男",
                addTime = DateTime.Now,
                delflag = 0
            };
            db.Add(user2);
            db.SaveChanges();


            //最终事务提交
            transaction.Commit();
            Console.WriteLine("操作成功");
        }
        catch (Exception ex)
        {
            //using包裹不需要手写rollback
            Console.WriteLine("错误为:" + ex.Message);
        }
    }
}

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

标签:Zack,批量,db,Batch,var,new,删除
From: https://www.cnblogs.com/yaopengfei/p/18137639

相关文章

  • 【Xss-fiddler漏洞测试】通过该种方式 可以批量扫描也可以使用super xary 进行图形扫
    下载xary-社区版生成xary证书xxxgencaChrome安装证书-设置-隐私安全-安全-管理证书-导入 Chrome安装代理 Fiddler设置转向代理 命令行启动xary 启动xary,启动被测试网站-一边操作一边查看--触发后的命中效果    ......
  • 3d动画如何连续渲染?云渲染批量渲染3d动画
    在3D动画的生产过程中,从多个角度渲染同一场景既是时间消耗大户,也对设计人员的技术能力提出了高要求。好在云渲染技术的进步为这一挑战提供了高效的解决办法。通过利用云渲染服务进行批量渲染,设计师们可以大幅节约时间并提升工作效率。3d动画如何连续渲染方法一:批处理渲染1、点......
  • QGIS脚本批量导出sld样式文件
    在QGIS中批量导出图层样式到SLD(StyledLayerDescriptor)文件,可以使用以下Python脚本。这个脚本将遍历项目中的所有图层,然后将它们的样式保存为单独的SLD文件。#导入必要的模块fromqgis.coreimportQgsProject#sld文件路径sld_path=r"D:\Desktop\中国沿海航......
  • vim批量注释首行
    :setnu显示行:1,13s/^/#/g注释首行:ctrl+v可视化,光标放到第一行开头,选择需要每行需要删除的内容,dd就删除了 ......
  • 利用Sqlmap API接口联动Google Hacking批量SQL注入检测
    目录前言slghack自动化搜集URLSqlmapAPI脚本slghack_sqli前言挖掘SQL注入漏洞的一种方式就是通过GoogleHacking搜索那些可能存在SQL的URL,然后手工的探测注入点。但是现在的SQL注入漏洞的网站是比较少的了,所以这样一个一个手工测效率有一点低。sqlmap比较好的一点是可批量扫描......
  • Python+FastJson漏洞批量检测实战
    #-*-coding:utf-8-*-importosimportsubprocess#指定要读取文件的目录directory='D:/gongju02/anq/FastJson/JsonExp-1.4.0'defjson_exp(text_path):"""指定要检测的接口文件目录"""try:#改变当前工作目录os.chdir(di......
  • SOLIDWORKS模板批量修改工具 慧德敏学
    SOLIDWORKS批量修改模板插件-SolidKits.BOMs工具可实现工程图模板的批量替换,单位系统的批量修改,批量定义模型材质等功能。操作简单快捷,只需要提前打开SOLIDWORKS软件,执行后程序会自动完成所有替换操作。使用SOLIDWORKS绘制工程图之前,必须要选择工程图模板,模板中我们会定义好图幅......
  • 卷积神经网络基础---批量归一化(BN层、 Batch Normalization)
    原文链接:https://blog.csdn.net/weixin_43972154/article/details/1201998331.BN层的作用BN层使得神经网络能够设定较高的初始学习率,加速模型收敛过程;将数据进行归一化处理,即在网络的每一层输入的时候,插入了一个归一化层,然后再进入网络的下一层。这样能提高网络的泛化能力,使得网......
  • PDF文件批量拆分为图片文件
    文章目录前言一、PDF如何快速拆分成图片?二、准备搞起来!!!1.执行代码2.简易GUI前端总结前言一、PDF如何快速拆分成图片?先在百度进行了搜索,好多都是在线的工具,用几次还可以,但是拆分的文件多了,或者文件比较大就会有限制,思来想去,不如自己写一个本地脚本,用着方便也便捷,说......
  • 抖音评论采集|视频评论批量提取下载工具
    大家好,随着抖音平台的蓬勃发展,现在视频评论都已成为了个人和企业拓展客户群体、了解用户喜好的重要途径之一。现在为了帮助您更高效地采集并分析抖音视频评论,推出了全新版本的抖音视频评论批量采集工具,为您的营销策略提供强有力的支持!......