سلام دوستان یک سوالی در مورد شرایط استفاده از متد 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 همه تغییرات روی دیتابیس اصلی اعمال میشه.
اما از جمله معایب این روش سنگینی حجم اطلاعات هست. یعنی اگر رکوردهای زیادی رو بخواید واکشی کنید سرعت اجرا میتونه بسیار کند بشه. بنابراین در همه سناریو ها قابل استفاده نیست.
خب روش دیگه ای که برای واکشی اطلاعات از دیتابیس و نگهداری رکوردهای واکشی شده در DbContext وجود داره روش NoTracking هست. در موارد زیر میتونید از این روش استفاده کنید :
در مثال زیر اطلاعات به روش NoTracking واکشی شده
var blogs = context.Blogs
.AsNoTracking()
.ToList();
همچنین میتونید اگر اطلاعاتی رو به صورت Tracking واکشی کردید و بنا به دلایلی قصد دارید NoTracking کنید توسط دستور زیر این کار رو انجام بدید.
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var blogs = context.Blogs.ToList();
این لینک از خود مایکروسافت در این رابطه هست.
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2042
- پاسخ :
1
|
تاریخ :
1403/01/06
- ساعت :
05:14:00 PM
- بازدید :
689
- پاسخ :
1
|
تاریخ :
1402/12/12
- ساعت :
03:20:00 PM
- بازدید :
544
- پاسخ :
1
|
تاریخ :
1402/07/20
- ساعت :
01:34:00 PM
- بازدید :
932
- پاسخ :
1
|
تاریخ :
1402/06/27
- ساعت :
12:27:00 PM
- بازدید :
1477
- پاسخ :
2
|
تاریخ :
1402/06/25
- ساعت :
11:37:00 AM
- بازدید :
1055
- پاسخ :
1
|
تاریخ :
1402/03/05
- ساعت :
11:36:00 PM
- بازدید :
1151
- پاسخ :
1
|
تاریخ :
1402/03/03
- ساعت :
07:57:00 AM
- بازدید :
1080
- پاسخ :
1
|
تاریخ :
1401/12/03
- ساعت :
07:18:00 PM
- بازدید :
1244
- پاسخ :
1
|
تاریخ :
1401/11/01
- ساعت :
09:58:00 AM
- بازدید :
1454
- پاسخ :
1
|
تاریخ :
1403/09/06
- ساعت :
09:51:00 PM
- بازدید :
97
- پاسخ :
1
|
تاریخ :
1400/07/17
- ساعت :
10:39:00 PM
- بازدید :
2340
- پاسخ :
0
|
تاریخ :
1403/09/05
- ساعت :
06:32:00 PM
- بازدید :
74
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2042
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
120
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
153
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1072
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
477
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
951
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1382
- پاسخ :
1
|