آموزش 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ها را کنترل کنیم
  • عملیات‌های نوشتن-خواندن را بهینه کنیم

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آموزش Tracking و No Tracking در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آموزش Tracking و No Tracking در EF Core در شبکه‌های اجتماعی

نظرات شما برای ما ارزشمند است

متاسفانه تاکنون پیامی برای این مطلب ثبت نشده است. شما اولین شخصی باشید که پیام می‌گذارد.

نظرات کاربران

فرم افزودن دیدگاه

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

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.