تشریح مسئله :شاید شما هم هنگام ثبت، ویرایش و حتی حذف دادههای زیاد در Code First متوجه کاهش چشمگیر کارایی پروژه خود شده باشید.(برای مثال ثبت 5000 داده یا بیشتر به صورت هم زمان).برای رفع مشکل بالا چه باید کرد؟
نکته :آشنایی اولیه با مفاهیم EF CodeFirst برای درک بهتر مفاهیم الزامی است.
EntityFramework Code First هنگام کار با Poco Entities برای اینکه مشخص شود که چه داده هایی باید به دیتابیس ارسال شود مکانیزمی به نام Detect Changed معرفی کرده است که وظیفه آن بررسی تفاوتهای بین مقادیر خواص CurrentValue و OriginalValue هر Entity است که باعث افت چشمگیر سرعت هنگام اجرای عملیات CRUD میشود.
هنگامی که از یک Entity کوئری گرفته میشود یا از دستور Attach برای یک Entity استفاده میکنیم مقادیر مورد نظر در حافظه ذخیره میشوند. استفاده از هر کدام دستورات زیر DbContext را مجبور به فراخوانی الگوریتم Automatic Detect Changed میکند.
در پایان هم وضعیت را به حالت قبل بر میگردانیم.
در مورد کاهش مصرف حافظه EF CodeFirst هنگام واکشی دادههای زیاد هم میتونید از این مقالهاستفاده کنید.
نکته :آشنایی اولیه با مفاهیم EF CodeFirst برای درک بهتر مفاهیم الزامی است.
EntityFramework Code First هنگام کار با Poco Entities برای اینکه مشخص شود که چه داده هایی باید به دیتابیس ارسال شود مکانیزمی به نام Detect Changed معرفی کرده است که وظیفه آن بررسی تفاوتهای بین مقادیر خواص CurrentValue و OriginalValue هر Entity است که باعث افت چشمگیر سرعت هنگام اجرای عملیات CRUD میشود.
هنگامی که از یک Entity کوئری گرفته میشود یا از دستور Attach برای یک Entity استفاده میکنیم مقادیر مورد نظر در حافظه ذخیره میشوند. استفاده از هر کدام دستورات زیر DbContext را مجبور به فراخوانی الگوریتم Automatic Detect Changed میکند.
- DbSet.Find
- DbSet.Local
- DbSet.Remove
- DbSet.Add
- DbSet.Attach
- DbContext.SaveChanges
- DbContext.GetValidationErrors
- DbContext.Entry
- DbChangeTracker.Entries
البته Code First امکانی را فراهم کرده است که هنگام پیاده سازی عملیات CRUD اگر تعداد دادههای شرکت کننده زیاد است برای رفع مشکل کاهش سرعت بهتر است این رفتار را غیر فعال کنیم . به صورت زیر:
using (var context = new BookContext()) { try { context.Configuration.AutoDetectChangesEnabled = false; foreach (var book in aLotOfBooks) { context.Books.Add(book); } } finally { context.Configuration.AutoDetectChangesEnabled = true; }
در مورد کاهش مصرف حافظه EF CodeFirst هنگام واکشی دادههای زیاد هم میتونید از این مقالهاستفاده کنید.