AsNoTracking() Nedir?
AsNoTracking()
, Entity Framework Core’un, sorgudan dönen nesneleri değişiklik izleme (change tracking) kapsamı dışında tutmasını sağlar. Yani EF Core, bu nesnelerin sonradan güncellenip güncellenmediğini takip etmez. Bu da daha az bellek kullanımı ve daha hızlı sorgu performansı sağlar.
📈 Ne Zaman Kullanılır?
- Sadece veri okunacaksa, örneğin bir listeleme ekranında.
- Veriler güncellenmeyecekse.
- Read-Only işlemlerde performansı artırmak için.
🧠 Ne Zaman Kullanılmaz?
- Eğer entity üzerinde değişiklik yapıp,
SaveChanges()
ile veritabanına kaydedecekseniz kullanmayın. - Çünkü EF, bu nesneyi izlemeyecek ve değişiklikleri fark etmeyecektir.
✅ Örnek Kullanım
csharpKopyalaDüzenlevar products = await _context.Products
.AsNoTracking()
.Where(p => p.Price > 100)
.ToListAsync();
Burada Products
listesinden sadece fiyatı 100’den büyük olanlar alınır ve EF Core bu entity’leri izlemez.
🔄 Normal İzleme ile Fark
csharpKopyalaDüzenle// Normal (Tracking ile)
var product = await _context.Products.FirstOrDefaultAsync(p => p.Id == 1);
product.Name = "Yeni İsim";
await _context.SaveChangesAsync(); // Bu değişikliği kaydeder
csharpKopyalaDüzenle// AsNoTracking ile
var product = await _context.Products
.AsNoTracking()
.FirstOrDefaultAsync(p => p.Id == 1);
product.Name = "Yeni İsim";
await _context.SaveChangesAsync(); // Bu çalışmaz! EF değişikliği fark etmez
🛠️ Not: AsNoTrackingWithIdentityResolution()
EF Core 5.0+ ile gelen bu özellik, ilişkili nesnelerde tekrarlayan entity örneklerini engeller ama hâlâ NoTracking
özelliğini korur. Eğer ilişkili verilerle çalışıyorsanız ama performans istiyorsanız bu yöntem de değerlendirilebilir.
🧩 Performans Kıyaslaması
Tracking
: Daha fazla bellek kullanır ama güncelleme mümkündür.AsNoTracking
: Daha az kaynak kullanır, daha hızlıdır, ama güncelleme yapılamaz.