本文转自: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. poj2240

    一个关于套利的题,就是判断是否有正环,我这里是用的SPFA,只要判断出来一种货币初始为1,最后变得大于1就代表是正环,要注意一下最后对vector的清空,当时从1开始清空,导致wa了两次,找了半天,尽 ...

  2. delphi 中OutputDebugString 函数的妙用(转载)

    原文地址 https://www.peganza.com/delphi-and-outputdebugstring.html Ever wanted to monitor your Delphi ap ...

  3. virtual和abstract的区别

    virtual和abstract都是用来修饰父类的,前面不能用private私有,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的.  毕竟加上virtual或abstract就是让子类重新定义 ...

  4. js删除map中元素

    js中删除map中元素后,map的长度不变,这时需要我们自己处理 delete vacc[0]; delete vacc[1]; ClearNullArr(vacc); //清除vacc中的null值 ...

  5. Merge Parts of Rar/7z Package in Linux

    When file is too large, we will compress it and split it into several parts. Now Let me show you how ...

  6. re、词云

    正则:   re.S使点也能匹配到\n:re.I不区分规则中的大小写:re.X忽略空格及#后的注释:re.M把^和$由文首文末变为各行的首尾.   Egの删除各行行尾的alex,alex不区分大小写: ...

  7. Codeforces Round #512 (Div. 2) D. Vasya and Triangle

    参考了别人的思路:https://blog.csdn.net/qq_41608020/article/details/82827632 http://www.cnblogs.com/qywhy/p/9 ...

  8. day11_雷神_udp、多进程等

    day11 1.网络编程 1.1 udp协议 client端 import json import socket server_addr = ('127.0.0.1',9090) sk = socke ...

  9. WCF双工通信单工通信

    1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...

  10. Visual Studio 代码快捷键

    目录 1.常用快捷键 2.快速生成代码 3.自定义代码片段 参考: https://blog.csdn.net/qq_32452623/article/details/53838393 https:/ ...