本文转自: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. 【Mybatis】MyBatis配置文件的使用(二)

    本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...

  2. 【Selenium】【BugList4】执行pip报错:Fatal error in launcher: Unable to create process using '""D:\Program Files\Python36\python.exe"" "D:\Program Files\Python36\Scripts\pip.exe" '

    环境信息: python版本:V3.6.4 安装路径:D:\Program Files\python36 环境变量PATH:D:\Program Files\Python36;D:\Program F ...

  3. 亲写javascript 各类面试题

    DOM修改: 1.全文单词首字母大写---2013 腾讯 var toCapitalize = function (str){ var aStr1 = str.split(" ") ...

  4. 使用GetAdaptersInfo时,网卡类型的值为71

    使用GetAdaptersInfo时,网卡类型的值为71,代表无线网卡.

  5. CentOS7 启动中文输入法

    CentOS 系统中是带有中文输入法的(智能拼音),启动方式如下: Applications --> System Tools -->  Setting --> Region &am ...

  6. oracle表空间扩容方法

    1.使用navicat连接要扩容的数据库,进入其他-表空间 2.添加数据文件和设置配置项即可

  7. 删除sheet

    /// <summary> /// 删除sheet /// </summary> /// <param name="fileName">< ...

  8. stm32手册上的英文

    crystal-less 无晶振 USB  FS(Full-speed)此外还有High-speed接口(简称HS),Low-speed接口(简称LS) frequency频率 CRC(Cyclic ...

  9. 如何修改config?

    这几天在做给WCF做加密传输,结果当然是实现了加密传输,同时也发现了一个问题,有没有大神来答疑解惑一下. 事情是这样的. 在客户端的配置中,需要加入一个behavior,在config文件中是这样的. ...

  10. ng4 路由多参数传参以及接收

    import { Router } from '@angular/router'; constructor( private router:Router, ) { } goApplicationDet ...