احسان میرسعیدی
احسان میرسعیدی
خواندن ۳ دقیقه·۷ سال پیش

نکته ای در مورد نحوه کارکرد EF

1. باید بدانیم آنچه که موجب می شود EF به طور خودکار و بدون دخالت توسعه دهنده، بداند چگونه باید کوئری های اش رو تولید کرده و به پایگاه داده ارسال کند از طریق الگوریتمی به نام DetectChanges انجام می پذیرد. این الگوریتم به طور خودکار به EF می فهماند که چه چیزهایی باید از پایگاه داده حذف شده، چه چیز های اضافه شده و چه چیزهایی به روزرسانی شوند و چطور کوئری ها به طور بهینه تولید شوند.
مثلا در صورتی که مقادیری از یک موجودیت را ویرایش می کنیم، EF با استفاده از این الگورتیم متوجه می شود که باید در حین ساخت کوئریِ Update، فقط برای مقادیری که تغییر کرده اند کوئری را تولید نماید و نه به ازای همه مقادیر این شی.
2. نکته بعدی این است که الگوریتم DetectChanges می تواند بسیار زمانگیر باشد. چرا که EF این الگوریتم را بر روی تک تک اشیایی که در Context بارگذاری شده اند، اجرا می کند و نه فقط بر روی یک شی. مثلا اگر تمام مشتری ها (مثلا 5000 تا) را در سیستم بارگذاری کرده باشیم و بخواهیم پردازشی را بر روی آن ها انجام دهیم، این الگورتیم در هر بار اجرا بر روی همه آن ها اجرا می شود.
3. مسئله بعدی این است که این الگوریتم چه زمانی توسط EF اجرا می شود؟ ما هر زمان که از متد های Remove، Add، SaveChanges، Find و Attach استفاده می کنیم، EF به طور خودکار الگوریتم DetectChanges را بر روی تمامی اشیا موجود در Context اجرا خواهد کرد. 
حال فرض کنید، مشتری ها را بارگذاری کرده اید و درون یک حلقه می خواهید ابتدا با متد Find داده ای را جستجو کرده و در صورتی که نبود، آن داده را به آن اضافه کنید. در ابتدا با صدا زدن متد Find یک بار DetectChanges صدا زده می شود و یکبار هم با صدا زدن متد Add. این می تواند به شدت پردازش داده ها را کند نماید.
4. جهت افزایش کارایی برنامه، مخصوصا در حلقه ها و در صورت وجود داده های بسیار زیاد در Context، به نظر می رسد در گاهی موارد، خاموش کردن اجرای خودکار DetectChanges باید حتما در نظر گرفته شود و این سرعت اجرای برنامه را به شدت افزایش خواهد داد.

context.Configuration.AutoDetectChangesEnabled = false

مطلبی مختصر در همین زیمنه در سایت مستندات مربوط به EF:

https://msdn.microsoft.com/en-us/data/jj556205

در مطالبی قبلی گفتیم، که صدا زدن برخی از متد ها در EF منجر به صدا زدن الگوریتم DetectChanges در EF خواهد شد. این متد در هنگامی که با داده های زیادی دست و پنجه نرم می کنیم، بسیار باعث افت سرعت خواهد شد. متد هایی که منجر به اجرای این الگوریتم هزینه بر می شدند، شامل Add یا Remove هم می شدند.
در EF6، متد هایی با نام های AddRange و RemoveRange اضافه شده اند. کاربرد این ها هنگامی است که می خواهیم داده های زیادی را در پایگاه داده اضافه کنیم.
قبل از EF6 برای افزودن تعدادی شی به Context، باید هر شی را به ترتیب با متد Add اضافه می کردیم و هر بار صدا زدن این متد منجر به اجرای الگوریتم DetectChanges در "تمام اشیا" Context می شد.
اما با EF6 با صدا زدن AddRange و یا RemoveRange، تمام اشیایی که می خواهیم به پایگاه داده اضافه کنیم، به یکباره اضافه خواهیم کرد و دیگر نیازی نیست مدام متد Add  یا Remove را صدا بزنیم. از فواید این متدهای جدید این است که فارغ از تعداد اشیایی که به Context اضافه یا حذف می شوند، متد DetectChanges فقط "یکبار" اجرا خواهد شد و نه چندین و چند بار!

irandotnetmirsaeedientity framrworkcsharpoptimization
شاید از این پست‌ها خوشتان بیاید