zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    异步编程
    写代码写至最有面向对象味道
    GitHub上整理
    用CQRS+ES实现DDD
    前端开发
    让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式
    NHibernate系列
    hadoop搭建开发环境及编写Hello World
    Linux date -s(转)
    即时编译和打包您的 Groovy 脚本(转)
  • 原文地址:https://www.cnblogs.com/mi21/p/9875679.html
Copyright © 2011-2022 走看看