转自:http://www.cnblogs.com/nianming/archive/2013/06/07/3123103.html#2699851

记录下。

园友莱布尼茨写了一篇《Entity Framework数据插入性能追踪》的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围。读完文章+评论,于是我自己也写了个简单的程序试了试。

先晒一下代码:

两个简单的类:

 :      /// <summary>
: /// 消费者
: /// </summary>
: public class Consumer
: {
: public int CId { get; set; }
: public string CName { get; set; }
: public List<Order> Orders { get; set; }
: }
:
: /// <summary>
: /// 订单
: /// </summary>
: public class Order
: {
: public int OrderNo { get; set; }
: public DateTime OrderDate { get; set; }
: public decimal TotalMoney { get; set; }
: public int CId { get; set; }
:
: public Consumer Consumer { get; set; }
: } 映射配置: : public class ConsumerConfiguration : EntityTypeConfiguration<Consumer>
: {
: public ConsumerConfiguration()
: {
: HasKey(t => t.CId).Property(t => t.CId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
: Property(t => t.CName).IsRequired().HasMaxLength();
: }
: }
:
: public class OrderConfiguration : EntityTypeConfiguration<Order>
: {
: public OrderConfiguration()
: {
: HasKey(t => t.OrderNo);
: HasRequired(t => t.Consumer).WithMany(t => t.Orders).HasForeignKey(t => t.CId);
: }
: }
Context:

   :      public class TestContext : DbContext
: {
: public DbSet<Consumer> Consumers { get; set; }
: public DbSet<Order> Orders { get; set; }
:
: protected override void OnModelCreating(DbModelBuilder modelBuilder)
: {
: modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
:
: modelBuilder.Configurations.Add(new ConsumerConfiguration());
: modelBuilder.Configurations.Add(new OrderConfiguration());
:
: base.OnModelCreating(modelBuilder);
: }
: }
测试代码: : static void Main(string[] args)
: {
: using (var ctx = new TestContext())
: {
: ctx.Consumers.Add(new Consumer()
: {
: CName = "张三"
: });
: ctx.SaveChanges();
:
: Stopwatch sw = new Stopwatch();
: sw.Start();
: Console.WriteLine("订单开始:\n");
:
: for (int outer = ; outer < ; outer++)
: {
: ctx.Orders.Add(new Order()
: {
: OrderDate = DateTime.Now,
: TotalMoney = ,
: CId = ,
: });
: }
: ctx.SaveChanges();
: sw.Stop();
: Console.WriteLine(sw.Elapsed.Minutes + "分" + sw.Elapsed.Seconds + "秒" + sw.Elapsed.Milliseconds + "毫秒");
: }
: }

上面的代码是最平常的代码了,没有什么可解释的,将内容放到重点上。

运行以上代码的环境是VS2012+SQL SERVER 2008 R2,机器配置:4G,N年以前的CPU。

运行上面的代码非常的慢,正如莱布尼茨说的,在数据Add到上下文这个阶段比较耗时。出现这个问题的原因是:每次调用ctx.Orders.Add(order)之前,EF都会调用DetectChanges,在StackOverFlow上有解释,地址是:http://stackoverflow.com/questions/9439430/improving-performance-of-initializing-dbset-in-seed,另外在Programming Entity Framework DbContext这本书的60也有DetectChange的介绍。

解决上面速度慢的问题的办法就是设置

   1:  ctx.Configuration.AutoDetectChangesEnabled = false;

下面来看看禁用以后的执行速度:

另外一个解决办法就是使用DbSet<T>.AddRange方法,这个方法是在6.0 beta1中加入的。

 :                  List<Order> orderList = new List<Order>();
: for (int outer = ; outer < ; outer++)
: {
: orderList.Add(new Order()
: {
: OrderDate = DateTime.Now,
: TotalMoney = ,
: CId =
: });
: }
: ctx.Orders.AddRange(orderList);
: ctx.SaveChanges();

AddRange方法在System.Data.Entity 泛型DbSet类中,下图是我通过Reflector截的图

从上面两幅图中可以看到,Add和AddRange都是添加到_internalSet中,但是如果AutoDetectChangesEnabled设置为true的话,添加任何实体之前都会调用DetectChanges,注意看Remarks中的解释。

AutoDetectChangesEnabled及AddRange解决EF插入的性能问题的更多相关文章

  1. 【测试记录】EF插入查询性能

    介绍     背景什么就不提了,无外乎出现了大数据需要处理.简单的说就是我测试了EF正常的插入以及一个优化小方式而已,然后做了查询记录.其余没有什么,写这篇只是为了记录结果方便以后数据参考吧. 代码介 ...

  2. 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

    一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并 ...

  3. 【EF】解决EF批量操作,Z.EntityFramework.Extensions 过期方案

    方案一: 使用EntityFramework.Extended优点: 启下载量是Z.EntityFramework.Extensions的10倍+ 不会过期缺点:不能批量Insert 方案二:解决批量 ...

  4. 解决EF没有生成字段和表说明

    找了很多资料,终于找到一篇真正能解决ef生成字段说明,注释的文章,收藏不了,于是转载 本文章为转载,原文地址 项目中使用了EF框架,使用的是Database-First方式,因为数据库已经存在,所以采 ...

  5. 【转】MySQL批量SQL插入各种性能优化

    原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...

  6. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...

  7. 仿小米便签图文混排 EditText解决尾部插入文字bug

    一直想实现像小米便签那样的图文混排效果,收集网上的办法无非三种: 1.自定义布局,每张图片是一个ImageView,插入图片后插入EditText,缺点是实现复杂,不能像小米便签那样同时选中图片和文字 ...

  8. 解决table插入tr错位

    table中用JavaScript插入隐藏(即display="none";)的tr时,别用display="block";换成display="&q ...

  9. MySQL插入数据性能调优

    插入数据性能调优总结: 1.SQL插入语句调优 2.如果是InnoDB引擎的话,尝试开启事务,批量提交 3.调整MySQl数据库配置     参考: 百度空间 - MySQL插入数据性能调优 CSDN ...

随机推荐

  1. scvmm sdk之powershell(一)

    shell表示计算机操作系统中的壳层,与之相对的是内核,内核不能与用户直接交互,而是通过shell为用户提供操作界面,shell分为两类,一种提供命令行界面,一种提供图形界面.windows powe ...

  2. datetime.date(2014, 4, 25) is not JSON serializable

    # 背景 接口期望返回json格式数据,但数据存储在mysql中,先将mysql的数据转为dict,然后将dict转为json格式,然后就报这个错误了的,原因就是时间格式转换问题 # 解决方法 1. ...

  3. 基于python 3.5 所做的找出来一个字符串中最长不重复子串算法

    功能:找出来一个字符串中最长不重复子串 def find_longest_no_repeat_substr(one_str): #定义一个列表用于存储非重复字符子串 res_list=[] #获得字符 ...

  4. Working Set

    类似于Visual Studio中的Solution 如果Eclipse中的project过多,而且不是同一个真实的项目中的,可以按Working Set对project进行组织,只是一个逻辑组织 操 ...

  5. JQuery对象函数

    1.JQuery对象函数写法格式 简单示例: main代表对象名,main.roleName = (function () { return $('#RoleName').val();})();表示为 ...

  6. parseInt/类型转换/字符串

    1.pa'rseInt整型 1.1parseInt必须以数字开头的 var topVal = parseInt("28px"); console.log(topVal); 1.2非 ...

  7. leecode刷题(20)-- 删除链表中的节点

    leecode刷题(20)-- 删除链表中的节点 删除链表中的节点 描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = ...

  8. 【文文殿下】CF1029F Multicolored Markers

    这道题考场上卡了文文相当长的时间,所以写个题解泄泄愤QAQ 题意:给你$a$块红瓷砖,$b$块白瓷砖,在一个无限大的地上拼装,要求整体是一个矩形,并且至少有一种颜色是一个矩形,求最小周长. 题解: 首 ...

  9. 一篇文章搞懂Linux安全!

    Linux是开放源代码的免费正版软件,同时也是因为较之微软的Windows NT网络操作系统而言,Linux系统具有更好的稳定性.效率性和安全性. 在Internet/Intranet的大量应用中,网 ...

  10. [转] 测试环境下将centos6.8升级到centos7的操作记录

    1)查看升级前的版本信息 lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noa ...