دسته بندی ها
12:45 1399/06/07

کاربرد متد AsNoTracking در انتیتی فریم ورک

مشخصات سوال کننده :
کاربر : fateme     امتیاز کاربر : 1617     رتبه کاربر : 2
دسته بندی : Entity Framework

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 8806
پاسخ دهنده : hamid_b 22:43 1399/06/08

ببین به صورت خیلی ساده بخوام بگم میشه گفت وقتی شما اطلاعاتی رو از دیتابیس فراخوانی می کنید این اطلاعات که مجموعه ای از رکوردها می تونه باشه از سمت دیتابیس میاد و در شی DbContext پروژه شما در مدل Code First قرار می گیره.

خب در اینجا شما مجموعه ای از رکوردها رو دارید که به صورت خام در DbContext شما وجود داره. اما اگر بخواید بهتر مفهوم AsNoTracking رو متوجه بشید بهتر هست ابتدا مفهوم Tracking رو بدونید.

به صورت پیش فرض اطلاعات به صورت Tracking از سمت دیتابیس میان و در شی DbContext شما ذخیره میشه. خب این حالت مزایایی داره و معایبی هم داره

 

مزایا و معایب واکشی اطلاعات به صورت Tracking

وقتی شما اطلاعات رو به صورت معمولی (Tracking) از سمت دیتابیس واکشی می کنید اطلاعات به صورت کامل در اختیار برنامه قرار می گیره و میتونید هر تغییری رو روی اطلاعات انجام بدید. مثلا میتونید اطلاعات رو حذف کنید یا ویرایش کنید.

در ادامه نمونه ای از واکشی اطلاعات رو به صورت Tracking مشاهده می کنید.

 

var blog = context.Blogs.SingleOrDefault(b => b.BlogId == 1);
blog.Rating = 5;
context.SaveChanges();

 

دستور بالا به صورت Tracking اطلاعات روواکشی کرده و ویرایش رو انجام داده. در واقع در واکشی اطلاعات به صورت Tracking بعد از تغییر اطلاعات و استفاده از دستور SaveChange همه تغییرات روی دیتابیس اصلی اعمال میشه.

 

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

 

کاربرد متد AsNoTracking در انتیتی فریم ورک

خب روش دیگه ای که برای واکشی اطلاعات از دیتابیس و نگهداری رکوردهای واکشی شده در DbContext وجود داره روش NoTracking هست. در موارد زیر میتونید از این روش استفاده کنید :

  • این روش معمولا برای وقتی مفید هست که بخواید اطلاعات رو به صورت فقط خواندنی یا read-only واکشی کنید. 
  • وقتی قصد نمایش اطلاعات را دارید این روش مفید هست.
  • مواقعی که قصد جستجو در اطلاعات را دارید.
  • وقتی سرعت اجرا برای شما مهم می باشد.

 

در مثال زیر اطلاعات به روش NoTracking واکشی شده

 

var blogs = context.Blogs
    .AsNoTracking()
    .ToList();

 

همچنین میتونید اگر اطلاعاتی رو به صورت Tracking واکشی کردید و بنا به دلایلی قصد دارید NoTracking کنید توسط دستور زیر این کار رو انجام بدید.

 

context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var blogs = context.Blogs.ToList();

 

این لینک از خود مایکروسافت در این رابطه هست.

ویرایش شده در یکشنبه 9 شهریور 1399 ساعت 03:26:00
به این پاسخ امتیاز بدهید    5
امتیاز: 510 رتبه: 4
1 نظر
zahraRfe : ممنون خیلی خوب توضیح دادی، میشه یه سوال ازت بپرسم؟ مفهوم mapping رو میشه توضیح بدی که دقیقا چه کاری میکنه؟

امتیاز کاربر : 0   رتبه کاربر : 7018   تاریخ ثبت : 03:05 1401/08/12
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود