• EF批量添加


      1.首先,打开工具——NuGet包管理器——管理解决方案的NoGet程序包——搜索Z.EntityFramework.Extensions

      

      点击安装!!!

      

      codefirst定义一个实体,用EF的方法添加数据

      static void Main(string[] args)
            {
                using (ConsoleDBContext context = new ConsoleDBContext())
                {
                    // '''定义要添加数据的条数'''
                    int customerCount = 10000;
    
                    //  '''定义一个实体集合'''
                    List<Users> customers = new List<Users>();
    
                    var sw = new Stopwatch();
                    sw.Start();
                    // '''想集合中添加数据'''
                    for (int i = 0; i < customerCount; i++)
                    {
                        Users customer = new Users()
                        {
                            id = Guid.NewGuid(),
                            name = i + ""
                        };
                        //customers.Add(customer);
                        context.Users.Add(customer);
                    }
                    context.SaveChanges();
                    
                    //context.BulkInsert(customers);
                    //context.BulkSaveChanges();
                    sw.Stop();
                    Console.Write(sw.Elapsed);
                    Console.ReadKey();
                }
    
            }

    运行完成:插入10000条数据,用时55秒

    接下来我们看看用EF的拓展方法能用多长时间

      static void Main(string[] args)
            {
                using (ConsoleDBContext context = new ConsoleDBContext())
                {
                    // '''定义要添加数据的条数'''
                    int customerCount = 10000;
    
                    //  '''定义一个实体集合'''
                    List<Users> customers = new List<Users>();
    
                    var sw = new Stopwatch();
                    sw.Start();
                    // '''想集合中添加数据'''
                    for (int i = 0; i < customerCount; i++)
                    {
                        Users customer = new Users()
                        {
                            id = Guid.NewGuid(),
                            name = i + ""
                        };
                        customers.Add(customer);
                        //context.Users.Add(customer);
                    }
                    //context.SaveChanges();
                    context.BulkInsert(customers);
                    context.BulkSaveChanges();
                    sw.Stop();
                    Console.Write(sw.Elapsed);
                    Console.ReadKey();
                }
            }

    运行完成:插入10000条数据,用时到0.2秒

    为什么扩展方法用的时间这么少?

    EF自带的方法,会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交,下面的图片是我用SQL Server Profiler记录的和数据库交互的操作,这只是一小部分,试想,如果你的数据量达到万级别(更不用说百万,千万数据了),那对数据库的压力是很大的

    这里写图片描述

    而扩展方法运行时与数据库的交互是这样的:

    这里写图片描述

    批量添加的方法是生成一条SQL语句,和数据库只交互一次。那为什么图片中有多条Insert语句呢,当你使用BulkInsert时,如果数据达到4万之前,那在SQL的解释时,也是很有压力的,有多情况下会超时,当然这与你的数据库服务器有关,但为了性能与安全,将Bulk操作变为分批提交,即将上W的数据进行分解,分用1W数据量提交一次,这样,对数据库的压力就小一些。

     不过这种方法好像不能进行多表操作(有主外键的),如果有朋友研究好了,可以给我留言 sun645430@163.com

    下面的分析引用风枫疯的文章,在这里注明:https://www.cnblogs.com/xuyufeng/p/6612589.html

  • 相关阅读:
    【随手记录】关于mysql的SSL证书登录
    【随手记录】关于ES安装的一些问题记录
    【随手记录】关于yml环境变量未配置,导致项目启动报NPE错误
    【随手记录】关于oracle修改最大连接
    【随手记录】关于 dockercompose.yml version 3里面deploy资源约束告警问题
    【随手记录】关于docker挂载路径必须为绝对路径
    【随手记录】关于浏览器调用摄像头样例
    【随手记录】关于idea调试时提示源码不匹配(source code does not match the bytecode)
    浅析报表的测试
    2022中级会计分录
  • 原文地址:https://www.cnblogs.com/mi21/p/9875679.html
Copyright © 2020-2023  润新知