AddDbContext mặc định là scoped vì một DbContext được thiết kế cho một đơn vị công việc ngắn: mở, đọc/ghi, SaveChanges, rồi dispose. Trong web app, đơn vị đó khớp đúng với một HTTP request.
Singleton hỏng ở ba điểm:
- Không thread-safe.
DbContextkhông hỗ trợ nhiều thao tác chạy song song. Hai request đồng thời dùng chung instance sẽ némInvalidOperationException: A second operation was started on this context instance before a previous operation completed. - Change tracker tích luỹ vô hạn. Mọi entity đã query đều bị giữ lại, bộ nhớ tăng dần và các query sau chậm dần vì phải quét snapshot.
- Dữ liệu cũ. Query tracked trả về instance đã cache trong change tracker, không phải giá trị mới nhất trong DB.
csharp
builder.Services.AddDbContext<AppDbContext>(o => o.UseNpgsql(cs)); // scopedHệ quả: một service singleton không được inject DbContext trực tiếp — đó là lỗi captive dependency.
Trong trường hợp đó dùng IDbContextFactory<T> hoặc IServiceScopeFactory để tạo scope riêng.