بررسی راهکارهای افزایش کارایی در Entity Framework Core 2 : بخش اول

naeemaei Entity Framework, دات نت , , , ,

گاهاً یکی از نقاط ضعف Entity Framework در مقابل ORM های دیگر که مطرح می گردد کارایی کوئری های ایجاد شده توسط EF است. علت این مشکل هم عدم دخالت برنامه نویس در کوئری ایجاد شده توسط EF می باشد. (اینجا بخوانید)

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

تاثیر Change Tracker

وظیفه Change Tracker نگهداری (رهگیری) تغییرات Entity ها در EF است. این ابزار که امکان غیرفعالسازی هم دارد، وضعیت Entity ها در سطح Property و Row را نگهداری می کند. کسانی که سابقه کار با ADO.Net را دارند به یاد دارند که با هر بار تغییرات روی یک DataRow وضعیت یا RowState آن DataRow بصورت خودکار تغییر می کرد. با این مقدمه نحوه کارکرد Change Tracker را با یک سناریو در EF را توضیح می دهیم.

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

فرض کنید Entity را از دیتابیس واکشی کرده و تغییراتی روی آن اعمال کرده ایم، EF همه لحظات چرخه حیات Context وضعیت Entity را نگهداری می کند.

حال متد SaveChanges را فراخوانی می کنیم. چه اتفاقی خواهد افتاد؟ Entity Framework باید دستورات SQL را ادامه کرده و برای اجرا به Database Engine ارسال نماید. قبل از آماده سازی دستورات SQL عملیات Detect Changes انجام خواهد شد اما عملیات Detect Changes چیست؟

در این مرحله EF وضعیت هر Entity را بررسی می کند که هر Entity می تواند یکی از وضعیت های زیر را داشته باشد:

Added
Modified
Deleted
Unchanged
Detached

وضعیت های Added و Deleted در حالت نرمال بر اساس کدهای برنامه نویس روی یک Entity اعمال می شود.

اما بر اثر تغییری که برنامه نویس روی یک Entity دریافت شده از دیتابیس اعمال می کند، وضعیت Entity نیز به Modified تغییر می یابد.

برای نمونه:

پس از خطوط فوق زمانی که تابع SaveChanges() فراخوانی می شود، عمل شناسایی تغییرات آغاز می شود و مقادیر اولیه و جدید فیلدهای Entity انجام شده و پس از آن کوئری Update فیلدهای تغییرکرده رکورد(های) انتخاب شده ساخته و برای Database Engine ارسال می گردد.

هدف از مباحث فوق رسیدن به این نکته بود که در موارد بسیاری هدف ما از دریافت مقادیر یک یا چند Entity از دیتابیس در EF فقط و فقط نمایش اطلاعات به کاربر است و نیازی به Track کردن یا ردیابی تغییرات یک Entity نداریم، بنابراین در این موارد می توانیم این ویژگی EF را غیر فعال نماییم.

متد AsNoTracking()

همانطور که عنوان شد در Entity Framework بصورت پیش فرض تغییرات مدل ها Track می شود. اما در مواردی که نیاز به رهگیری تغییرات نداریم می توانیم از متد AsNoTracking استفاده کنیم. تغییرات همه ی Entity هایی در Context ثبت شده اند و وجود دارند در  Entity Framework رهگیری می شوند. برای نمونه کد زیر را ببینید:

در این قطعه کد Change Tracker تغییرات مدل Person را رهگیری کرده و در زمان فراخوانی متد SaveChangesAsync بر اساس خصوصیات تغییر یافته کوئری Update را تولید می نماید.

با استفاده ازتابع زیر می توانید وضعیت Entity های موجود در Context را مشاهده نمایید (این تابع در مثال بالا استفاده شده است):

با یک مثال بحث را ادامه خواهیم داد، فرض کنید قصد دارید لیست افراد را در یک فرم نمایش دهید. در این مسئله هیچ نیازی به تغییر اطلاعات دریافتی از دیتابیس نداریم و فقط قصد نمایش لیست را داریم بنابراین برای دریافت اطلاعات اینگونه عمل می کنیم:

بررسی یک مثال و مشاهده کارایی AsNoTracking()

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

مثال بدون استفاده از AsNoTracking
مدت زمانی که طول خواهد کشید که اطلاعات از دیتابیس خواهد شده و در متغیر people قرار گیرد حدود 170 میلی ثانیه خواهد بود.

حال در تصویر زیر از متد AsNoTracking استفاده کرده ایم:

مدت زمان خواندن و لود اطلاعات در متغیر people حدود 59 میلی ثانیه شده است که حدود یک سوم حالت قبل می باشد، آنچه مشخص است EF در زمان فعال بودن استفاده از Change Tracker پس از دریافت اطلاعات از دیتابیس اعمال دیگری هم انجام می دهد که البته در آینده به آنها خواهیم پرداخت.

اما نکته ای که حائز اهمیت است این است که کارایی و سرعت برنامه فقط در همین گام افزایش نخواهد یافت بلکه استفاده صحیح از Change Tracker در طول استفاده از مدل people روی کارایی برنامه شما تاثیر خواهد داشت.

شاید دوست داشته باشید:

ویژگی های جدید Entity Framework Core 3

نسخه EF Core همچنان در حال توسعه می باشد و آخرین نسخه نهایی ارائه شده از آن در زمان نگارش این مقاله نسخه 2.2 می باشد، اما نسخه 6 Preview از EF Core 3 نیز در حال توسعه می باشد.

من در این مقاله قصد دارم ویژگی های جدیدی که قرار است در نسخه EF Core 3 اضافه گردند را معرفی کنم

آشنایی با ویژگی های جدید c# 8 – بخش اول

سی شارپ 8 و قابلیت های آن: قبل از بررسی قابلیت های C# 8 به نکته زیر توجه نمایید. نکته […]

2 دیدگاه

  1. با سلام ! مبحثی را که در مورد Entity Framework بود خیلی واضح توضیح دادید که جای تحسین دارد . ان شاالله همین طوری ادامه بدهید با تشکر

    1. با سلام، ممنون از همراهی شما، ان شاالله مباحث ادامه خواهد یافت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *