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?
Definition. DBContext is a wrapper of ObjectContext that exposes the most commonly used features of ObjectContext. In contrast, Object Context is a class of the core Entity framework API that allows performing queries and tracking the updates made to a database using strongly typed entity classes.
Entity Framework loads very slowly the first time because the first query EF compiles the model. If you are using EF 6.2, you can use a Model Cache which loads a prebuilt edmx when using code first; instead, EF generates it on startup.
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 from 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:
Add
, Attach
, Find
, Local
, or Remove
members on DbSet
GetValidationErrors
, Entry
, or SaveChanges
members on DbContext
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 it 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With