Reference · Backend · EF Core

EF Core: change tracking, Migration, N+1, AsNoTracking

Ringkasan satu halaman. Dari Lesson 0006.

DbContext dan change tracking [1]

StateArtiSaveChanges
Addedbaru (Add)INSERT
Unchangedhasil query, belum diubah—
Modifiedproperty diubahUPDATE
Deletedditandai RemoveDELETE
Detachedtidak dilacak (mis. hasil AsNoTracking)diabaikan

Migration (code-first) [2]

dotnet ef migrations add AddProductSku       # bandingkan model vs snapshot → file migration (di-commit)
dotnet ef database update                    # terapkan; dicatat di __EFMigrationsHistory
dotnet ef migrations script --idempotent     # production: SQL script yang direview

N+1 [5]

// ✗ lazy loading: 1 query Category + 1 query per Category
foreach (var c in await db.Categories.ToListAsync())
    foreach (var p in c.Products) { ... }

// ✓ eager loading, satu query
await db.Categories.Include(c => c.Products).ToListAsync();
// ✓ projection ke DTO, hanya kolom yang perlu (juga tidak dilacak)
await db.Categories.Select(c => new CategoryResponse(c.Id, c.Name, c.Products.Select(p => p.Name).ToList())).ToListAsync();

AsNoTracking [6]

Jawaban 60–90 detik

Lihat log SQL dulu. N+1 = satu query awal + satu query per baris untuk relasinya, biasanya dari lazy loading di dalam loop. Perbaiki dengan Include atau projection Select ke DTO dalam satu roundtrip. Untuk endpoint read-only pakai AsNoTracking (tanpa snapshot/change tracker); endpoint yang mengubah data tetap tracking karena SaveChanges butuh change tracker.

Sumber: [1] Change Tracking · [2] Migrations Overview · [3] Managing Database Schemas · [4] Applying Migrations · [5] Efficient Querying · [6] Tracking vs. No-Tracking Queries