EF Core Change Tracking
Implement or sketch code for EF Core Change Tracking. Explain the logic, complexity, and pros/cons of this approach.
Answers use simple, clear English.
Quick interview answer
Logic: DbContext tracks entities loaded in context. SaveChanges generates INSERT/UPDATE/DELETE.
Detailed answer
Logic: DbContext tracks entities loaded in context. SaveChanges generates INSERT/UPDATE/DELETE. AsNoTracking skips tracking for read-only queries — faster, less memory. Complexity notes included in code section when present. Pros: Automatic change detection; migrations keep schema in sync. Cons: Tracking large graphs hurts performance; stale data if long-lived context. Core: DbContext tracks entities loaded in context. SaveChanges generates INSERT/UPDATE/DELETE. AsNoTracking skips tracking for read-only queries — faster, less memory. Real-time example: Report query uses AsNoTracking(); edit form loads entity with tracking for SaveChanges update. Pros: Automatic change detection; migrations keep schema in sync. Cons: Tracking large graphs hurts performance; stale data if long-lived context. Common mistakes: Mixing tracked and detached graphs; attaching wrong state. Best practices: Short-lived DbContext per request; explicit Entry().State when needed. Audience level: Architect.
Full explanation
DbContext tracks entities loaded in context. SaveChanges generates INSERT/UPDATE/DELETE. AsNoTracking skips tracking for read-only queries — faster, less memory.
Real example & use case
Report query uses AsNoTracking(); edit form loads entity with tracking for SaveChanges update.
Pros & cons
Pros: Automatic change detection; migrations keep schema in sync. Cons: Tracking large graphs hurts performance; stale data if long-lived context.
Code example
// Read-only — no tracking
var names = await db.Users.AsNoTracking()
.Where(u => u.Active)
.Select(u => u.Name)
.ToListAsync();
// Update tracked entity
var user = await db.Users.FindAsync(id);
user!.LastLogin = DateTime.UtcNow;
await db.SaveChangesAsync();Practice code · csharp (view only · no execution)
// Read-only — no tracking
var names = await db.Users.AsNoTracking()
.Where(u => u.Active)
.Select(u => u.Name)
.ToListAsync();
// Update tracked entity
var user = await db.Users.FindAsync(id);
user!.LastLogin = DateTime.UtcNow;
await db.SaveChangesAsync();Common mistakes
Mixing tracked and detached graphs; attaching wrong state.
Best practices
Short-lived DbContext per request; explicit Entry().State when needed.
Follow-up questions
- How would you test EF Core Change Tracking?
- What metrics prove EF Core Change Tracking is healthy in prod?
- How does EF Core Change Tracking change at 10× traffic?