Originally I believed that
context.Configuration.AutoDetectChangesEnabled = false;
would disable change tracking. But no. Currently I need to use AsNoTracking()
on all my LINQ queries (for my read only layer). Is there a global setting to disable tracking on the DbContext?
Since this question is not tagged with a specific EF version, I wanted to mention that in EF Core the behavior can be configured at the context level.
You can also change the default tracking behavior at the context instance level:
using (var context = new BloggingContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var blogs = context.Blogs.ToList();
}
What about simply exposing method like this on your derived context and use it for queries:
public IQueryable<T> GetQuery<T>() where T : class {
return this.Set<T>().AsNoTracking();
}
Setting AsNoTracking
globally is not possible. You must set it per each query or per each ObjectSet
(not DbSet
). The latter approach requires using ObjectContext
API.
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var set = objectContext.CreateObjectSet<T>();
set.MergeOption = MergeOption.NoTracking;
// And use set for queries