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

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

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

context.Configuration.AutoDetectChangesEnabled = false

مطلبی مختصر در همین زیمنه در سایت مستندات مربوط به EF:
https://msdn.microsoft.com/en-us/data/jj556205