实际的测试代码和数据记录,还有最终的总结都在下面:

        /// <summary>/// 这种做法,不用了说了,每次遍历都会打开一次db链接,然后执行insert操作;/// </summary>static void CreateBluckInsertData0(){using (var context = new SiteDbContext()){List<Role> list = new List<Role>();var count = 1000;for (int i = 0; i < count; i++){var entity = new Role(){RoleName = "普通员工" + i};context.Roles.Add(entity);context.SaveChanges();}}}/// <summary>/// 初看,觉得,这样做( context.SaveChanges()方在for循环外面)挺好的,/// 实际跟踪slq发现,还是执行了1000的插入操作,只不过没有在for循环里面;/// 而是在我们的for循环外;总结:不可取;/// </summary>static void CreateBluckInsertData1(){using (var context = new SiteDbContext()){List<Role> list = new List<Role>();var count = 1000;for (int i = 0; i < count; i++){var entity = new Role(){RoleName = "普通员工" + i};context.Roles.Add(entity);}context.SaveChanges();//会增加与数据库的交互次数//EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交
            }}/// <summary>/// 拼接字符串;组装后一次性操作;确定,传递的字符数量就会很多;网络压力增加;但不管怎样都比上面两张好;/// </summary>static void CreateBluckInsertData2(){Stopwatch watch = Stopwatch.StartNew();var count = 92000;using (var context = new SiteDbContext()){var bluckString = new StringBuilder();for (int i = 0; i < count; i++){bluckString.Append("INSERT INTO ROLES(RoleName) VALUES('");bluckString.Append("WORKER");bluckString.Append(i);bluckString.Append("');");}var result = bluckString.ToString();Console.WriteLine(string.Format("拼接字符串花费的时间:{0} milliseconds.",watch.ElapsedMilliseconds));//然后这里再来一次性批量的进行插入操作;
                watch.Restart();context.Database.ExecuteSqlCommand(result);//这样做的好处就是,可以一次性,全部插入,缺点就是;发送大量的insert 文本信息;//1000 customers are created, cost 1777 milliseconds.//5000 customers are created, cost 1906 milliseconds.//9000 customers are created, cost 2354 milliseconds.//9000 customers are created, cost 2023 milliseconds.//这样的计算比较草率;
            }watch.Stop();Console.WriteLine(string.Format("{0} customers are created, cost {1} milliseconds.", count.ToString(), watch.ElapsedMilliseconds));//结果:拼接字符串花费的时间:97 milliseconds.//12000 customers are created, cost 2028 milliseconds.//拼接字符串花费的时间:99 milliseconds.//22000 customers are created, cost 2336 milliseconds.//拼接字符串花费的时间:118 milliseconds.//92000 customers are created, cost 6553 milliseconds.
        }/// <summary>/// 这里我们使用第三种方法;/// 网上提供的插件的方法;/// 你以为,插件的方法,就是单纯的封装上面的操作?太年轻了,俺都没监测到一条insert 语句;那么它是怎么做的呢?/// /// </summary>static void CreateBluckInsertData3(){Stopwatch watch = Stopwatch.StartNew();var count = 92000;using (var context = new SiteDbContext()){List<Role> list = new List<Role>();for (int i = 0; i < count; i++){var entity = new Role(){RoleName = "普通员工" + i};list.Add(entity);//context.Roles.Add(entity); //fuck stupid;
                }Console.WriteLine(string.Format("拼接对象花费的时间:{0} milliseconds.", watch.ElapsedMilliseconds));//然后这里再来一次性批量的进行插入操作;
                watch.Restart();context.BulkInsert(list);context.BulkSaveChanges();}watch.Stop();Console.WriteLine(string.Format("{0} customers are created, cost {1} milliseconds.", count.ToString(), watch.ElapsedMilliseconds));//1000 customers are created, cost 2865 milliseconds//5000 customers are created, cost 18207 milliseconds.//9000 customers are created, cost 51134 milliseconds. (发现是方法用错了,窝草).不要把 context.Roles.Add(entity); 添加在for循环中;//然后结果是这样的:9000 customers are created, cost 2320 milliseconds.//效率明显比上面的方法提高了很多;//由此可见,我们的批量,效果操作,并不由之前那种方法高呢;//拼接对象花费的时间:102 milliseconds.//12000 customers are created, cost 2238 milliseconds.//拼接对象花费的时间:101 milliseconds.    //22000 customers are created, cost 2258 milliseconds.///拼接对象花费的时间:123 milliseconds.// 92000 customers are created, cost 3054 milliseconds.//这种方式的优势就不断体现出来了;//总结,凭借,字段串额效果,要比拼接对象集合的效率要高一些;//然后,就是我们的
}//可能涉及到一些批量数据迁移的时候;///总结:public void Info(){//凭借字段串的效率比拼接对象List的效率要高一些;//方式2的缺点在于,要传送大量的sql语句到我们的db中去执行,//方式3的实现方式和方式一有着本质的区别;是通过;//是数据小于五万条的时候,方式2的效率高,随着数据量的增加;方式3的优势就体现出来了//如果实际的开发中遇到大数据的批量操作;建议还是是用插件方式,就是我们的的方式3;//ps 操作中犯了一个错,是list.add(entity) 而不是 context.Roles.Add(entity); //fuck stupid;
}static void Main(string[] args){HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();//CreateBluckInsertData1();//CreateDB();//CreateBluckInsertData3();// CreateBluckInsertData2();
Console.ReadLine();}

当然,这里还有我们的另外一种做法;

SqlBulkCopy 接口描述

Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。 SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案

似乎这种效率更高一些(不过,俺没有去测)

阅读资料后,发现,z的扩展插件使用的就是我们的sqlbulkcopy接口滴呀;

大致的流程如下:

  • 在SQL Server中创建一张临时表;
  • 使用.NET SqlBulkCopy将数据批量插入临时表;
  • 在临时表和目标表之间执行一条SQL语句;
  • 从SQL Server删除临时表。

参考文献:

http://www.cnblogs.com/gaochundong/p/entity_framework_bulk_insert_extension.html

这里有一偏使用心得:

https://www.cnblogs.com/mobydick/archive/2011/08/28/2155983.html

还有这个:

https://www.cnblogs.com/zfanlong1314/archive/2013/02/05/2892998.html

转载于:https://www.cnblogs.com/mc67/p/8011432.html

关于EF中批量添加的个人探索相关推荐

  1. python 批量增加文件前缀_linux中批量添加文件前缀的操作方法

    linux中批量添加文件前缀的操作方法 需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx ...

  2. linux在目录前加前缀,linux中批量添加文件前缀的操作方法

    需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx.txt": 网上搜来的脚本如 ...

  3. linux批量在文件名前面加前缀,linux中批量添加文件前缀的操作

    linux中批量添加文件前缀的操作 需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件"xxx.txt"变成"gt_xxx.t ...

  4. Linuxvim 中批量添加注释

    vim 中批量添加注释 方法一 :块选择模式 批量注释: Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按 ...

  5. Excel中批量添加超链接

    [摘要] 工作中经常需要给文件添加超链接,方便进行文档查阅,如果文档过多,一个一个添加超链接很麻烦,这时候批量添加超链接就非常重要了.下面将结合示例告诉大家如何在Excel中进行批量超链接的设置. [ ...

  6. Bigemap中批量添加第三方在线地图教程

    说明:批量添加可以同时添加多个在线地图,一次性添加完成 第一步 : 下载批量添加批处理文件:添加文件 第二步: 查看文件,打开一个txt文件,直接拖进去,如下图: 文件里面,记录了常用的一些地图的浏览 ...

  7. 利用VBA在excel中批量添加备注

    excel表中有4列数据,给第4列添加批注,批注的内容为第4列的数据,如何批量添加呢? 按Alt+f11打开VBA编辑器,加入以下代码 Sub 添加批注() Dim t As String For i ...

  8. 在Office365中批量添加联系人

    在O365中,联系人项没有提供批量导入的选项,需要一个一个添加.需要大批量添加时,无疑是一件很痛苦的事! 实际上,我们可以使用Windows PowerShell和CSV文件批量导入联系人.主要分为以 ...

  9. 在AD中批量添加多个用户帐号

    问题: 如何批量的创建帐号? 解决方案: 在利用CSVDE.EXE或LDIFDE.EXE来批量创建用户帐号 实验环境: Windows 2003 如果我们要想批量的创建帐号的话,我们可以首先利用文字编 ...

最新文章

  1. Android友盟增量更新
  2. Nginx-09:Nginx原理
  3. MYSQL5.7 忘记ROOT密码/初始化ROOT密码
  4. 在centos6.4 编译64位的hadoop 2.4.1
  5. go thrift demo
  6. 美国WH在明尼苏达州最大光伏阵列完工
  7. java concurrent之前戏synchronized
  8. SQL Server--疑难杂症之坑爹的Windows故障转移群集
  9. 涡轮增压扫地机器人_帮着做家务,好坏在哪里,科沃斯T5扫地机器人
  10. 开源mes系统_如何让iMES系统快速落地变得so easy?
  11. 数据库切换为mysql中出现的问题:Error loading MySQLdb module.
  12. 开启人才进阶之旅,鲲鹏开发者技术沙龙点燃计算行业激情
  13. 研究生新人如何高效读论文-方法积累笔记
  14. 如何快速更换证件照背景颜色
  15. 电影院票务管理系统数据库设计
  16. 『IT视界』 [原创评论]揪出"程序员"身上的"六宗罪"
  17. andorid 源码北京公交线路查询(离线)
  18. 幽灵行动:NVIDIA 310M显卡完美超频直逼中高端显卡
  19. 病毒感染检测(数据结构串,c语言版)
  20. 大数据开发实习生--------------------入职篇

热门文章

  1. nginx图片过滤处理模块http_image_filter_module安装配置笔记
  2. [转载]64位linux安装WPS
  3. ASP.NET MVC 3中ViewBag, ViewData和 TempData
  4. 沉甸甸的证书,沉甸甸的心情
  5. 小型星形网络结构设计示例
  6. 塞尔达传说顺序_编码《塞尔达传说》克隆图例
  7. unity开发入门_Unity游戏开发终极入门指南
  8. 构建node.js基础镜像_我如何使用Node.js构建工作抓取网络应用
  9. 公司成立两周年感言_对我的副项目成立一周年的一些反思
  10. 从新手到入门,如何进入协议分析的世界