کاربرد متد AsNoTracking در انتیتی فریم ورک
سلام دوستان یک سوالی در مورد شرایط استفاده از متد AsNoTracking توی انتیتی فریمورک دارم. میخواستم ببینم وقتی ما در قسمت select در linq موجودیت رو مثلا به یک ViewModel مپ کنیم ، باز هم تراکینگ انجام میشه؟ یعنی در صورت نیاز لازمه که از دستور AsNoTracking استفاده کنیم؟
var products = dbcontext.product.select(p=> new ProductViewModel{ name=p.name,id=p.id}).ToList();
الان اینجا نیازه که از دستور AsNoTracking استفاده کنیم؟
ببین به صورت خیلی ساده بخوام بگم میشه گفت وقتی شما اطلاعاتی رو از دیتابیس فراخوانی می کنید این اطلاعات که مجموعه ای از رکوردها می تونه باشه از سمت دیتابیس میاد و در شی 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();
این لینک از خود مایکروسافت در این رابطه هست.
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- نمایش صفحه در پنجره جدید با کلیک روی لینک (تگ a) در Asp
- افزودن مقادیر به صورت دستی به List دریافت شده از ریپازیتوری
- رفع خطا در مایگریشن - Specify ON DELETE NO ACTION or ON UPDATE NO ACTION
- استفاده از دستور Group By در انتیتی فریم ورک
- محاسبه مجموع فروش بازاریاب و فروشنده در Sql Server
- فرق بین IEnumerable و IQueryable در دستورات انتیتی فریم ورک چیست ؟
- فرق بین انتیتی فریم ورک با LINQ چیست
- دلیل خطای Keyword not supported: data source در انتیتی فریم ورک Code First
- ایجاد کانکشن استرینگ داینامیک در WPF (تغییر پایگاه داده و سرور در نرم افزار)
- تبدیل کاراکترهای عربی به فارسی در سی شارپ | تبدیل کاراکتر "ی" به "ی" در WPF
- جا به جایی بین رکوردها در DataGrid در WPF و نمایش در اطلاعات تکست باکس
- نحوه جوین جداول و نمایش داده های دلخواه از 2 جدول در انتیتی فریم ورک