Tracking و No Tracking در EF Core یکی از پایهایترین و مهمترین مباحث در نحوه مدیریت دادههاست. درک صحیح از این مفهوم میتواند در بهینهسازی عملکرد برنامه و جلوگیری از خطاهای منطقی بسیار تأثیرگذار باشد. مثال ها در Asp.Net Core مورد برسی قرار میگیرد.
زمانی که ما یک Query را اجرا میکنیم. بعد از اجرا در حافظه snapshot ای اف کور قرار میگیرد. و شما میتوانید در لاین های بعدی برنامه به آن دسترسی داشته باشید. این به معنای Track شدن است.
Tracking (پیشفرض) : EF Core تغییراتی که روی users انجام شود را در حافظه نگه میدارد و هنگام SaveChanges() اعمال میکند.
var users = context.Users.ToList(); // توسط EF Core ردیابی میشود
No Tracking : ای اف کور موجودیتها را فقط برای خواندن (Read-Only) بارگیری میکند. و هیچگونه تغییری روی آنها ردیابی نمیشود. مناسب برای صفحات گزارشگیری، لیستهای فقط خواندنی، APIهای GET بدون تغییر.
var users = context.Users.AsNoTracking().ToList(); // بدون ردیابی
در سناریوهایی که صرفاً نیاز به نمایش دادهها است، استفاده از AsNoTracking() شدیداً توصیه میشود. اما در فرمهای ویرایش یا عملیاتهای وابسته به context، Tracking ضروری است.
هنگامی که یک کوئری اجرا میشود. و موجودیتها (Entities) از پایگاه داده واکشی میشوند. بهصورت پیشفرض EF Core آنها را ردیابی (Track) میکند. یعنی EF Core وضعیت اولیه موجودیت را در حافظه نگه میدارد. تا در صورت ایجاد تغییر، بتواند آن تغییرات را در زمان SaveChanges() به پایگاه داده اعمال کند. EF Core برای هر موجودیت، یکی از وضعیتهای زیر را نگه میدارد:
با این کد میتوان وضعیت تمام موجودیتهای در حال ردیابی را مشاهده کرد.
foreach (var entry in context.ChangeTracker.Entries())
{
Console.WriteLine($"Entity: {entry.Entity.GetType().Name}, State: {entry.State}");
}
ممکن است نخواهید SaveChanges() را صدا بزنید مگر اینکه دادهای واقعاً تغییر کرده باشد. مثلا در آپدیت.
if (context.ChangeTracker.HasChanges())
{
context.SaveChanges();
}
مفهوم Tracking در EF Core پایهایترین قسمت رفتار EF است. و درک آن به موارد زیر کمک میکند.