Why is inserting entities in EF 4.1 so slow compared to ObjectContext?

Basically, I insert 35000 objects within one transaction:

using(var uow = new MyContext()){
  for(int i = 1; i < 35000; i++) {
     var o = new MyObject()...;
     uow.MySet.Add(o);
  }
  uow.SaveChanges();
}

This takes forever! If I use the underlying ObjectContex t (by using IObjectAdapter ), it's still slow but takes around 20s. It looks like DbSet<> is doing some linear searches, which takes square amount of time...

Anyone else seeing this problem?


As already indicated by Ladislav in the comment, you need to disable automatic change detection to improve performance:

context.Configuration.AutoDetectChangesEnabled = false;

This change detection is enabled by default in the DbContext API.

The reason why DbContext behaves so different to the ObjectContext API is that many more functions of the DbContext API will call DetectChanges internally than functions of the ObjectContext API when automatic change detection is enabled.

Here you can find a list of those functions which call DetectChanges by default. They are:

  • The Add , Attach , Find , Local , or Remove members on DbSet
  • The GetValidationErrors , Entry , or SaveChanges members on DbContext
  • The Entries method on DbChangeTracker
  • Especially Add calls DetectChanges which is responsible for the poor performance you experienced.

    I contrast to this the ObjectContext API calls DetectChanges only automatically in SaveChanges but not in AddObject and the other corresponding methods mentioned above. That's the reason why the default performance of ObjectContext is faster.

    Why did they introduce this default automatic change detection in DbContext in so many functions? I am not sure, but is seems that disabling it and calling DetectChanges manually at the proper points is considered as advanced and can easily introduce subtle bugs into your application so use [it] with care.


    Little empiric test with EF 4.3 CodeFirst:

    Removed 1000 objects with AutoDetectChanges = true : 23 sec

    Removed 1000 objects with AutoDetectChanges = false: 11 sec

    Inserted 1000 objects with AutoDetectChanges = true : 21 sec

    Inserted 1000 objects with AutoDetectChanges = false : 13 sec


    在.netcore 2.0中,这被转移到:

    context.ChangeTracker.AutoDetectChangesEnabled = false;

    链接地址: http://www.djcxy.com/p/33558.html

    上一篇: 插入许多父母和孩子记录的最快方式

    下一篇: 与ObjectContext相比,为什么在EF 4.1中插入实体很慢?