روش هایی برای بهبود عملکرد فریم ورک Entity
سه شنبه 30 مهر 1398برای بهبود عملکرد فریم ورک Entity روش های زیادی وجود دارد، ما در این مطلب قصد داریم کمی بیشتر درباره روش های بهبود عملکرد فریم ورک Entity صحبت کنیم.
فریم ورک Entity مایکروسافت یک ORM گسترش یافته است که به شما کمک می کند تا مدل شی اپلیکیشن خود را از به مدل داده ها جدا کنید. فریم ورک Entity در واقع یک فریم ورک ORM متن باز برای ADO.NET است و در واقع به عنوان بخشی از فریم ورک .Net فعالیت می کند. در این مقاله من قصد دارم نکاتی را به شما نشان دهم که به شما کمک می کند تا بتوانید عملکرد فریم ورک Entity را بهبود دهید. من در بخش های بعدی نکاتی را بیان خواهم کرد که برای بهبود عملکرد این فریم ورک مورد استفاده قرار می گیرند.
آیا مدل داده ای Entity شما یک واحد تکی را نشان می دهد؟
زمانی که شما EDM(Entity Data Model) را در فریم ورک Entity می سازید باید اطمینان حاصل کنید که EDM شما یک واحد تکی را نشان می دهد نه کل دیتابیس شما را، این موضوع به خصوص زمانی که شما اشیا زیادی( جدول ها، رویه های ذخیره شده، ویوها و ...) را در دیتابیس خود دارید که از یکدیگر جدا هستند اهمیت بیشتری دارد. اگر EDM شما نشان دهنده کل دیتابیس در فریم ورک Entity باشد در حالی که واقعا تمام دیتابیس مورد نیاز نیست می تواند عملکرد برنامه را مختل کند چرا که در این زمان داده های غیر ضروری بسیار زیادی در مموری لود می شوند. در اصل شما باید در فریم ورک Entity یک مدل داده ای بزرگ را به مدل های داده ای کوچک تر تقسیم بندی کنید و هر مدل نماینده یک واحد از کار خاصی در برنامه شما باشد.
قابلیت Change tracking را در فریم ورک Entity غیر فعال کنید
اگر change tracking را در هنگام کار با فریم ورک Entity نیاز ندارید شما باید آن را غیر فعال کنید. مهمتر از همه این است که زمانی که شما فقط قصد دارید که داده ها را بازگردانی کنید و به روزرسانی در داده های خوانده شده نیاز نیست هیچ احتیاجی به change tracking ندارید. شما می توانید از دستور زیر برای غیر فعال کردن change tracking استفاده کنید و یا این که می توانید از آن برای ذخیره کردن نتایج کوئری های خود استفاده کنید.
اگر شما قصد دارید که object tracking را برای جدول مربوط به Customers غیر فعال کنید شما می توانید از قطعه کد زیر برای این کار استفاده کنید:
PayrollContext context = new PayrollContext();
با استفاده از ویوهای Pre-generated هزینه ساخت ویوها را در فریم ورک Entity کاهش دهید
به صورت کلی ساخت ObjectContext یک عملیات پر هزینه است چرا که هزینه لود کردن و اعتبار سنجی آن بسیار زیاد است، شما باید از ویوهای pre-generated استفاده کنید تا به این شکل بتوانید زمان رسپانس را زمانی که اولین درخواست اجرا می شود کاهش دهید. در اصل فریم ورک Entity زمانی که object context برای اولین بار مقدار دهی می شود به صورت ران تایم مجموعه ای از کلاس ها را می سازد( که همان ویو نامیده می شوند). شما می توانید این کار هزینه بردار را با استفاده از از پیش ساختن ویوها برای فایل EDMX با استفاده از دستور خط فرمان EdmGen.exe کاهش دهید. توجه داشته باشید که در صورتی که فایل schema مدل شما تغییر پیدا کند شما نیاز دارید که فایل های ویوها را دوباره بسازید که این کار را می توانید با استفاده از اجرا کردن EdmGen.exe همراه با فلگ مربوط به /mode:ViewGeneration انجام دهید. شما همچنین می توانید ویوها را از پیش با استفاده از یک کد در اولین مدل نیز بسازید.
قابلیت تشخیص خودکار تغییرات را غیر فعال کنید
زمانی که شما سعی می کنید تا دیتابیس فریم ورک Entity را به روز رسانی کنید نیاز دارید که تغییراتی که در یک entity در زمان لود شدن در مموری ایجاد می شود را بدانید این تشخیص تغییرات با استفاده از مقایسه مقادیر قدیمی و ویژگی های آن ها با مقادیر جدید صورت می گیرد و یا با استفاده از تغییراتی که در زمان فراخوانی هر یک از متدهایی مانند find()، remove()، add()، Attach() و SaveChanges() ایجاد می شود انجام می شود. این تشخیص خودکار تغییرات بسیار هزینه بردار است و زمانی که شما قصد دارید از entity های زیادی استفاده کنید می تواند باعث کاهش عملکرد برنامه شما شود.
یک نکته مهم برای غیر فعال کردن این قابلیت خودکار
زمانی که شما قصد دارید قابلیت تشخیص خودکار را غیر فعال کنید توصیه ما به شما این است که دستور مربوط به آن را در داخل یک بلوک مربوط به try/catch قرار دهید و بعد از آن در داخل بلوک مربوط به finally دوباره آن را فعال سازی کنید. توجه داشته باشید که شما می توانید زمانی که باید یک مجموعه داده کوچک و مرتبط با یکدیگر کار می کنید این نکته را در نظر نگیرید. شما می توانید با غیر فعال کردن این قابلیت شاهد بهبود فوق العاده عملکرد برنامه خود برای کار کردن با داده های مختلف باشید.
نکات دیگری که باید در نظر داشته باشید
در زمان بازگردانی داده ها از projection برای انتخاب فیلدهایی که مورد نیاز هستند استفاده کنید، شما باید از بازگرداندن فیلدهایی که به آنها نیازی ندارید جلوگیری کنید.
قطعه کد زیر به شما نشان می دهد که چگونه می توانید که چگونه می توانید از قابلیت بازگردانی داده ها در یک paged manner استفاده کنید. ( توجه داشته باشید که صفحه index چگونه شروع می شود و page size برای انتخاب داده هایی که مورد نیاز هستند استفاده می شود)
int pageSize = 25, startingPageIndex = 1; NorthwindEntities dataContext = new NorthwindEntities(); List lstCus = dataContext.tblCustomers.Take(pageSize) .Skip(startingPageIndex * pageSize) .ToList();
نکته دیگری که وجود دارد این است که شما باید مجموعه مناسبی را انتخاب کنید و از کوئری های کامپایل شده برای بهبود عملکرد کوئری های LINQ در زمانی که قصد دارید داده ها را با استفاده از EDM بازگردانی کنید استفاده کنید. از قرار دادن همه اشیا پایگاه داده خود در یک مدل داده ای در فریم ورک Entity جلوگیری کنید. توجه داشته باشید که تنها ستون هایی را بازگردانید که که به آنها نیاز دارید و علاوه بر این از استفاده کردن از Contains در فریم ورک Entity زمانی که از LINQ برای Entity ها استفاده می کنید جلوگیری کنید. شما می توانید از paging برای بازگردانی داده هایی که درخواست تنها برای آنها بوده است و یا محدود کردن داده هایی که از سمت دیتابیس بازگردانی می شوند استفاده کنید. نکته آخر نیز این است که شما باید indexe ها را به Entity های خود در برنامه اضافه کنید که این کار با فراخوانی متد CreateIndex صورت می گیرد.
- C#.net
- 1k بازدید
- 1 تشکر