در Entity Framework هر زمان یک یا چند رکورد را از دیتاها را از دیتابیس میخوانیم, به طور پیشفرض توسط ChangeTracker ردیابی میشوند. و همین امر باعث میشود مقداری کاهش پرفرمنس داشته باشیم. اگر نخواهیم که Entity Framework این عملیات ردیابی موجودیت ها را انجام دهد میتوانیم از AsNoTracking در هنگام خواندن دیتاها استفاده کنیم. به طور مثال در کد زیر لیست تمامی کاربران را دریافت میکنم و توسط ChangeTracker ردیابی نمیشوند:

var users = await _dbContext.Users.AsNoTracking().ToListAsync();

در این حالت مشکلی وجود ندارد و پرفرمنس خوبی هم دارد. اما اگر بخواهیم به همراه هر کاربر, نقش هر کاربر را هم دریافت کنیم چه؟ میتوانیم از Include استفاده کنیم.

به طور مثال باید به صورت زیر عمل کنیم:

var users = await _dbContext.Users.AsNoTracking()
                       .Include(a => a.Role).ToListAsync();

در این حالت چونکه Entity Framework موجودیت ها را ردیابی نمیکند, به ازای هر کاربر, یک موجودیت (Role) جدید برای نقش هر کاربر ایجاد میکند که این امر باعث ایجاد موجودیت های اضافی میشود. یعنی به ازای هر کاربر یک Role ایجاد میکند که ممکن است چند کاربر یک Role مشترک داشته باشند در حالی که میتوان از یک موجودیت Role برای چند کاربر استفاده کرد.

اما در Entity Framework Core 5 یک متد جدید به نام AsNoTrackingWithIdentityResoluyion اضافه شده است که ترکیبی از AsNoTracking و Tracking است. که مشکل قبل را حل میکند. یعنی داده ها را به صورت AsNoTracking دریافت میکند که ردیابی نشوند و همچنین تمامی کاربرانی که Role مشترک دارند به یک موجودیت اشاره میکنند نه هر کدام از کاربران موجودیت مربوط به خود را داشته باشد.

از این متد میتوان به صورت زیر استفاده کرد:

var users = await _dbContext.Users.AsNoTrackingWithIdentityResolution()
                       .Include(a => a.Role).ToListAsync();

:)

Powered by Froala Editor

نظرات

سایر نظرات
  • کامیار جمشیدی

    ممنونم. برای من مفید بود

    ارسال شده در تاریخ پنج شنبه، ۰۳ شهریور ۱۴۰۱
  • محمد شونم

    مطلب مفید و ارزشمندی بود، به لینکدین کانکشن دادم

    ارسال شده در تاریخ دوشنبه، ۰۹ بهمن ۱۴۰۲