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


























فرم افزودن دیدگاه
با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.