Global setting for AsNoTracking()?
In EntityFramework.Core it is very easy.
For this purpose you can use UseQueryTrackingBehavior method.
Code snippet is here:
services.AddDbContext<DatabaseContext>(options =>
{
options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
options.UseSqlServer(databaseSettings.DefaultConnection);
});
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
You could do something like this in your DbContext:
public void ObjectContext_OnObjectMaterialized(Object objSender, ObjectMaterializedEventArgs e)
{
Entry(e.Entity).State = EntityState.Detached;
}
Every time an object is materialized by your context, it will be detached and no longer tracked.
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();
}