本文转自:http://entityframework.net/improve-ef-add-performance

When you overuse the Add() method for multiple entities, your application suffers from performance issues.

 
 
 
 
 
1
using (var ctx = new CustomerContext())
2
{
3
    foreach(var line in lines)
4
    {
5
        var customer = new Customer();
6
        // ...code...
7
        ctx.Customers.Add(customer);
8
    }
9

10
    ctx.SaveChanges();
11
}
 
 

StackOverflow Related Questions

Answer

Is Entity Framework Add Really Slow?

In fact, the Add method is not slow at all. Adding an entity to a list cannot be that slow. It's the DetectChanges method invoked inside the Add method which is insanely slow!

Using the Add method in a loop is usually a poor practice which impacts your application performance severely when poorly used.

  • USE AddRange over Add (Recommended)
  • SET AutoDetectChanges to false
  • SPLIT SaveChanges in multiple batches

Use AddRange over Add (Recommended)

When adding multiple entities, you should always use Entity Framework AddRange once with a list instead of calling multiple time the Add method.

Why?

  • The Add method DetectChanges after every records added.
  • The AddRange method DetectChanges after all records are added.

Performance Comparisons

Operations 100 Entities 1,000 Entities 10,000 Entities
Add 15 ms 1,050 ms 105,000 ms
AddRange 1 ms 10 ms 120 ms

Note:

  • *: SaveChanges time not included
  • **: Entity with two relations

How?

  1. CREATE a list
  2. ADD entity to the list
  3. USE AddRange with the list
  4. SaveChanges
  5. Done!
 
 
 
 
 
1
using (var context = new EntityContext())
2
{
3
    // 1. CREATE a list
4
    List<Customer>  list = new List<Customer>();
5

6
    for(int i = 0; i < 2000; i++)
7
    {
8
        var customer = new Customer();
9
        // ...code...
10

11
        // 2. ADD entity to the list
12
        list.Add(customer);
13
    }
14

15
    // 3. USE AddRange with the list
16
    context.Customers.AddRange(list);
17

18
    // 4. SaveChanges
19
    ctx.SaveChanges();
20

21
    // 5. Done!
22
}
 
 

Try it online

SET AutoDetectChanges to false

When adding multiple entities, if you cannot use AddRange, set Entity Framework AutoDetectChanges to false

Why?

  • The Add method DetectChanges after every records added.

By disabling AutoDetectChanges, the DetectChanges method will only be invoked when you do it.

Performance Comparisons

Operations 100 Entities 1,000 Entities 10,000 Entities
True (Default) 15 ms 1,050 ms 105,000 ms
False 1 ms 14 ms 180 ms

Note:

  • *: SaveChanges time not included
  • **: Entity with two relations

How?

  1. SET AutoDetectChangesEnabled = false
  2. CALL DetectChanges before SaveChanges
  3. SaveChanges
  4. Done!
 
 
 
 
 
1
using (var context = new EntityContext())
2
{
3
    // 1. SET AutoDetectChangesEnabled = false
4
    context.Configuration.AutoDetectChangesEnabled = false;
5

6
    List<Customer>  list = new List<Customer>();
7
​
8
    for(int i = 0; i < 2000; i++)
9
    {
10
        var customer = new Customer();
11
        // ...code...
12

13
        list.Add(customer);
14
    }
15

16
    context.Customers.AddRange(list);
17

18
    // 2. CALL DetectChanges before SaveChanges
19
    context.ChangeTracker.DetectChanges();
20

21
    // 3. SaveChanges
22
    context.SaveChanges();
23

24
    // 4. Done!
25
}
 
 

Try it online

SPLIT SaveChanges into multiple batches

This solution is not recommended. When adding multiple entities, split entities with a batch size in multiple different contexts.

Why?

More tracking entities your context contains, slower the DetectChanges method is! So by reducing the number of entities by context, you improve the performance.

Performance Comparisons

Operations 100 Entities 1,000 Entities 10,000 Entities
Unlimited 15 ms 1,050 ms 105,000 ms
10 3 ms 40 ms 350 ms
100 15 ms 125 ms 1,200 ms
1,000 15 ms 1,050 ms 10,200 ms

Note:

  • *: SaveChanges time not included
  • **: Entity with two relations

How

  1. CREATE a batchSize variable
  2. CALL SaveChanges before creating a new batch
  3. CALL SaveChanges
  4. Done!
 
 
 
 
 
1
// 1. CREATE a batchSize variable
2
int batchSize = 400;
3

4
var context = new EntityContext();
5
​
6
for(int i = 0; i <= 2000; i++)
7
{
8
    // 2. CALL SaveChanges before creating a new batch
9
    if (i != 0 && i%batchSize == 0)
10
    {
11
        context.SaveChanges();
12
        context = new EntityContext();
13
    }
14

15
    var customer = new Customer();
16
    // ...code...
17

18
    context.Customers.Add(customer);
19
}
20
​
21
// 3. CALL SaveChanges
22
context.SaveChanges();
23
​
24
// 4. Done!
 
 

Try it online

[转]How to Improve Entity Framework Add Performance?的更多相关文章

  1. [2014-09-18]Entity Framework 6 预热、启动优化

    好久没写博客了,终于憋出了一个大招,现在总结下. 虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com: ...

  2. Access MongoDB Data with Entity Framework 6

    This article shows how to access MongoDB data using an Entity Framework code-first approach. Entity ...

  3. Entity Framework 6 预热、启动优化

    虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com:用户登陆注册 owner.xxx.com:个人用户 ...

  4. Performance Considerations for Entity Framework 4, 5, and 6

    Performance Considerations for Entity Framework 4, 5, and 6 https://msdn.microsoft.com/en-sg/data/hh ...

  5. [XAF] How to improve the application's performance

    [自己的解决方案]数据量大时,可显著提升用户使用体验! 1.Root ListView 参考官方的E1554 点击导航菜单后首先跳出查询条件设置窗体进行设置 可设置查询方案或查询方案的查询条件,排序字 ...

  6. Why you should use async tasks in .NET 4.5 and Entity Framework 6

    Improve response times and handle more users with parallel processing Building a web application usi ...

  7. Entity Framework与ADO.NET批量插入数据性能测试

    Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...

  8. Code First :使用Entity. Framework编程(8) ----转发 收藏

    第8章 Code First将走向哪里? So far, this book has covered all of the Code First components that reached the ...

  9. Code First :使用Entity. Framework编程(7) ----转发 收藏

    第7章 高级概念 The Code First modeling functionality that you have seen so far should be enough to get you ...

随机推荐

  1. C++探究foreach算法

    for_each在algorithm.h 中 template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _I ...

  2. Vuejs——(4)v-if、v-for

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   (二十)v-if ①标准v-if用法 简单来说,该值为true则显示该标签,为false则不显示 ...

  3. HTTPS抓包之Charles

    这里对HTTP请求的抓包操作不做讲解了,只讲解HTTPS的抓包要进行的操作. [说明]:下面以MAC电脑示例,Windows版本可参考:http://weibo.com/ttarticle/p/sho ...

  4. Jenkins内置环境变量的使用

    一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execute shell 或 Execute Windows batch command 3.点击输入框下方的“可用环 ...

  5. Visual Studio 2017中使用正则修改部分内容

    最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效果如下 修改前: /// <summary> /// ...

  6. JavaScript中的定时事件

    这两个函数都是在给定的时间之后开始执行的,并不是立即执行. var timeId = window.setTimeout("method()",1000); //定时执行,还可以这 ...

  7. AndroidStudio制作欢迎界面与应用图标

    前言 大家好,给大家带来AndroidStudio制作欢迎界面与应用图标的概述,希望你们喜欢 欢迎界面与应用图标 本项目使用Android Studio 3.0.1作为开发工具 activity_sp ...

  8. PCIE 2.0协议概念基本科普

    PCIE的概念:是电脑总线PCI的一种,它沿用现有的PCI编程概念及通信标准,但建基于更快的串行通信系统. 英特尔是该接口的主要支持者.PCIe仅应用于内部互连.由于PCIe是基于现有的PCI系统,只 ...

  9. 使用pyenv来管理python版本

    使用pyenv可以很方便的切换python版本,而不会影响系统的python版本,对需要使用supervisor(仅支持python2)托管程序,项目使用python3开发的情况十分有用 pyenv的 ...

  10. app自动化测试之实战应用(魅族计算器)

    模拟魅族计算器加法计算: from appium import webdriver desired_caps = {} desired_caps['deviceName'] = '621QECQ23D ...