C
C#16mo ago
SWEETPONY

Is it worth to use AsNoTracking in dbset?

I found this:
public class ReadOnlyReadModelDbContext
{
readonly ReadModelDbContext dbContext;
public ReadOnlyReadModelDbContext(ReadModelDbContext dbContext)
{
this.dbContext = dbContext;
}
public IQueryable<Qualification> Qualifications => dbContext.Qualifications.AsNoTracking();
public IQueryable<Function> Functions => dbContext.Functions.AsNoTracking();
public IQueryable<FunctionQualification> FunctionQualifications => dbContext.FunctionQualifications.AsNoTracking();
public IQueryable<Resource> Resources => dbContext.Resources.AsNoTracking();
public IQueryable<Node> Nodes => dbContext.Nodes.AsNoTracking();
public IQueryable<Location> Locations => dbContext.Locations.AsNoTracking();
}
public class ReadOnlyReadModelDbContext
{
readonly ReadModelDbContext dbContext;
public ReadOnlyReadModelDbContext(ReadModelDbContext dbContext)
{
this.dbContext = dbContext;
}
public IQueryable<Qualification> Qualifications => dbContext.Qualifications.AsNoTracking();
public IQueryable<Function> Functions => dbContext.Functions.AsNoTracking();
public IQueryable<FunctionQualification> FunctionQualifications => dbContext.FunctionQualifications.AsNoTracking();
public IQueryable<Resource> Resources => dbContext.Resources.AsNoTracking();
public IQueryable<Node> Nodes => dbContext.Nodes.AsNoTracking();
public IQueryable<Location> Locations => dbContext.Locations.AsNoTracking();
}
In my opinion it doesn't look correct. What do you think?
5 Replies
viceroypenguin
viceroypenguin16mo ago
you can just do:
services.AddDbContext<DbContext>(o =>
o.UseQueryTrackingBehavior(
QueryTrackingBehavior.NoTracking));
services.AddDbContext<DbContext>(o =>
o.UseQueryTrackingBehavior(
QueryTrackingBehavior.NoTracking));
and then when you need them to be tracking you can do _db.Functions.AsTracking() no need to have two different dbcontexts or anything like that
SWEETPONY
SWEETPONYOP16mo ago
didn't know about that! thanks
Joschi
Joschi16mo ago
Or you just call AsNoTracking() on the query itself, instead of changing the defaults.
Angius
Angius16mo ago
If you .Select() into DTOs — as you should — that alone disables tracking and if you're fetching something without projecting it, that means you're doing some fetch-update-save or fetch-delete-save pattern Where you do want tracking
Joschi
Joschi16mo ago
Interesting, did not know that.

Did you find this page helpful?