Най-добри практики за подобряване на ефективността на Entity Framework

Microsoft Entity Framework е разширена ORM, която ви помага да изолирате обектния модел на вашето приложение от модела на данни. Това е ORM рамка с отворен код за ADO.Net и е включена като част от .Net Framework. В тази публикация ще представя няколко съвета, които могат да се следват за оптимизиране на производителността на Entity Framework. В следващите раздели ще разгледам няколко съвета, които могат да бъдат приети за подобряване на производителността на приложенията, когато работите с Entity Framework.

Представлява ли вашият модел на субект данни една единица работа?

Когато създавате своя EDM (Entity Data Model), трябва да се уверите, че EDM представлява една единица работа, а не цялата база данни, особено когато имате много обекти (таблици, съхранени процедури, изгледи и т.н.) във вашата база данни, които са прекъснати или не са необходими за определена единица работа. Ако вашият EDM представлява цялата база данни, когато не е необходима, той може да влоши производителността на приложението поради необходимостта от зареждане на много ненужни обекти в паметта. По същество трябва да разделите модела данни на голям обект на по-малки, като всеки модел представлява единица работа.

Можете да се обърнете към тази MSDN статия за повече информация за това как може да се подобри производителността на Entity Framework.

Деактивирайте проследяването на промените

Трябва да деактивирате проследяването на промените, ако не е необходимо. Най-важното е, че не се нуждаете от проследяване на промените, когато просто искате да извлечете данни, а актуализациите на прочетените данни изобщо не са необходими. Можете да използвате следния израз, за ​​да деактивирате проследяването на промените или да кеширате резултата от заявка, когато искате да извлечете клиенти от базата данни, без да е необходимо да актуализирате записите.

Ако искате да деактивирате проследяването на обекти за таблицата Клиенти, можете да използвате следния код.

PayrollContext context = new PayrollContext();

Намалете разходите за генериране на изгледи с помощта на предварително генерирани изгледи

Създаването на ObjectContext е скъпа операция, тъй като включва разходите за зареждане и валидиране на метаданните. Трябва да се възползвате от предварително генерираните изгледи, за да намалите времето за отговор при изпълнение на първата заявка. По същество изпълнението на Entity Framework създава набор от класове (наричан още изглед), когато контекстът на обекта е създаден за първи път. Можете да намалите тези режийни разходи, като предварително генерирате изгледа за EDMX файла, като използвате инструмента за команден ред EdmGen.exe или шаблони T4. Имайте предвид, че ако файловете на схемата на модела са се променили, ще трябва да генерирате отново файла с изгледи, като изпълните EdmGen.exe с флага / mode: ViewGeneration. Можете също така да генерирате предварително изгледи с първи модел на код.

Деактивирайте автоматичното откриване на промените

Когато се опитва да актуализира базата данни, Entity Framework трябва да знае промените, направени в обект от момента на зареждането му в паметта. Това откриване на промени се извършва чрез сравняване на старите стойности на свойствата с новите или променените стойности, когато се обадите на методите като Find (), Remove (), Add (), Attach () и SaveChanges () методи. Това откриване на промени е много скъпо и може да влоши производителността на приложението предимно, когато работите с много обекти. Можете да деактивирате откриването на промени, като използвате следния код.

Когато искате да деактивирате откриването на промени, е добра практика да го деактивирате вътре в блок try / catch и след това да го активирате отново в блока final. Имайте предвид, че можете да игнорирате това, когато работите с относително малък набор от данни - ще получите значителна печалба в производителността, като изключите откриването на промени, когато работите с голям набор от данни.

Други точки, които трябва да имате предвид

Използвайте проекции, за да изберете само полетата, които са необходими при извличане на данни. Трябва да избягвате извличането на полета, които не са необходими.

Следният кодов фрагмент илюстрира как можете да използвате извличане на данни по страничен начин - обърнете внимание как индексът на началната страница и размерът на страницата са били използвани за избор само на данните, които са необходими.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = new NorthwindEntities();

List lstCus = dataContext.tblCustomers.Take(pageSize)

.Skip(startingPageIndex * pageSize)

.ToList();

Също така трябва да изберете подходящата колекция и да използвате компилирани заявки, за да подобрите производителността на вашите LINQ заявки при извличане на данни, изложени от EDM. Избягвайте да дърпате всички обекти на базата данни в един модел на данни на обект. Извличайте само необходимия брой записи и избягвайте да използвате „Съдържа“, когато използвате LINQ към обекти. Можете да използвате пейджинг, за да извлечете само данните, за които се иска или да ограничите количеството данни, които се извличат от базата данни. Също така, трябва да добавите индекси към вашите обекти, като извикате метода CreateIndex ().

Можете да научите повече за съображенията за производителността, когато използвате Entity Framework от тази връзка.