وقتی یک لیست از دیتابیس واکشی میکنید اگر AsNoTracking بکار نبریم رکورد یا رکوردها زیر نظر سیستم ردیابی دیتاکانتکست یا EF خارج میشه
و هنگام حذف یا ویرایش یک رکورد از این لیست واکشی شده نیاز هست دوباره به کانتکست بگیم مثلا رکورد شماره 1 که ویرایش کردیم وضعیت اون رکورد ویرایش شده به تغییر یافته تغییر بده
فرض کنیم با یک حلقه foreach رکورهای لیست رو پیمایش میکنیم و میخایم رکورد اول رو ویرایش کنیم
برای این کار دو روش هست
یکی اینکه باید با دستوراتی مثل FirstOrDefault رکوردی که میخایم ویرایش کنیم درون حلقه در کانتکست جستجو بزنیم و رکورد بازیافتی را تعییر بدیم و سپس savechange بزنیم
و روش دوم اینه که مثلا با یک حلقه foreach رکوردی که ویرایش کردیم بدون دستور firstordefaultپس از ویرایش یکی از اعضای حلقه ابتدا دستور Attach و سپس دستور Entry(entity).State = EntityState.Modified رو اجرا کنیم
مثل زیر
[CODE]
foreach (var data in list)
{
_context.Entry(data).State=EntityState.Modified;
_dbset.Attach(data);
}
حالا اگر لیستی با AsNotracking بدست آوردیم برای ویرایش کردن چنانچه یک حلقه Foreach بزنیم و مثلا رکورد اول رو ویرایش کنیم فقط کافیه Savechange دیتاکانتکست رو صدا بزنیم و دیگه نیاز به
context.Entry(data).State=EntityState.Modified;
_dbset.Attach(data);
نیست
ولی اگر هم صدا زده بشه اشکالی نداره و ضراحتا به سیستم ردیابی ef اعلان کرده ایم فلان رکورد در حالت ویرایش قرار گرفته است
پس نتیجه میگیریم هر وقت خواستیم یک لیست واکشی شده رو ویرایش یا حذف کنیم از AsNoTracking استفاده کنیم
ولی اگر خواستیم یک لیست نمایشی فقط خواندنی داشته باشیم از AsNoTracking استفاه میکنیم
در واقع وقتی از AsNoTracking استفاده میکنیم ef یک لایه یا پوسته بر روی رکوردها میکشه و تغییرات رکوردها رو زیر نظر میگیره و این یک کم سرعت رو هم پایین میاره