PDA

View Full Version : مورد استفاده از AsNoTracking



haamidd
چهارشنبه 14 تیر 1396, 22:12 عصر
من با وجود مطالعه چند مقاله ولی باز هم دقیق متوجه نشدم کی باید از AsNoTracking در EF استفاده کنیم و کی استفاده نکنیم.

ali_md110
پنج شنبه 15 تیر 1396, 01:02 صبح
وقتی یک لیست از دیتابیس واکشی میکنید اگر AsNoTracking بکار نبریم رکورد یا رکوردها زیر نظر سیستم ردیابی دیتاکانتکست یا EF خارج میشه


و هنگام حذف یا ویرایش یک رکورد از این لیست واکشی شده نیاز هست دوباره به کانتکست بگیم مثلا رکورد شماره 1 که ویرایش کردیم وضعیت اون رکورد ویرایش شده به تغییر یافته تغییر بده

فرض کنیم با یک حلقه foreach رکورهای لیست رو پیمایش میکنیم و میخایم رکورد اول رو ویرایش کنیم
برای این کار دو روش هست
یکی اینکه باید با دستوراتی مثل FirstOrDefault رکوردی که میخایم ویرایش کنیم درون حلقه در کانتکست جستجو بزنیم و رکورد بازیافتی را تعییر بدیم و سپس savechange بزنیم
و روش دوم اینه که مثلا با یک حلقه foreach رکوردی که ویرایش کردیم بدون دستور firstordefaultپس از ویرایش یکی از اعضای حلقه ابتدا دستور Attach و سپس دستور Entry(entity).State = EntityState.Modified رو اجرا کنیم
مثل زیر


foreach (var data in list)
{

_context.Entry(data).State=EntityState.Modified;
_dbset.Attach(data);


}

حالا اگر لیستی با AsNotracking بدست آوردیم برای ویرایش کردن چنانچه یک حلقه Foreach بزنیم و مثلا رکورد اول رو ویرایش کنیم فقط کافیه Savechange دیتاکانتکست رو صدا بزنیم و دیگه نیاز به
[CODE]
context.Entry(data).State=EntityState.Modified;
_dbset.Attach(data);

نیست
ولی اگر هم صدا زده بشه اشکالی نداره و ضراحتا به سیستم ردیابی ef اعلان کرده ایم فلان رکورد در حالت ویرایش قرار گرفته است
پس نتیجه میگیریم هر وقت خواستیم یک لیست واکشی شده رو ویرایش یا حذف کنیم از AsNoTracking استفاده کنیم
ولی اگر خواستیم یک لیست نمایشی فقط خواندنی داشته باشیم از AsNoTracking استفاه میکنیم
در واقع وقتی از AsNoTracking استفاده میکنیم ef یک لایه یا پوسته بر روی رکوردها میکشه و تغییرات رکوردها رو زیر نظر میگیره و این یک کم سرعت رو هم پایین میاره