Programování

Osvědčené postupy ke zlepšení výkonu Entity Framework

Microsoft Entity Framework je rozšířený ORM, který vám pomůže izolovat objektový model vaší aplikace od datového modelu. Je to open source ORM framework pro ADO.Net a je součástí jako .Net Framework. V tomto příspěvku představím několik tipů, které lze použít k optimalizaci výkonu Entity Framework. V následujících částech bych prozkoumal několik tipů, které lze přijmout ke zlepšení výkonu aplikace, když pracujete s Entity Framework.

Představuje váš datový model entity jednu pracovní jednotku?

Když vytváříte svůj EDM (Entity Data Model), měli byste zajistit, aby EDM představoval jedinou pracovní jednotku a ne celou databázi, zejména pokud máte v databázi mnoho objektů (tabulek, uložených procedur, pohledů atd.), Které jsou odpojené nebo nejsou potřebné pro konkrétní jednotku práce. Pokud vaše EDM představuje celou databázi, když ji nepotřebujete, může snížit výkon aplikace kvůli potřebě načtení mnoha nepotřebných objektů do paměti. V podstatě byste měli rozdělit datový model velké entity na menší, přičemž každý model představuje jednotku práce.

V tomto článku MSDN najdete další informace o tom, jak lze zlepšit výkon Entity Framework.

Zakázat sledování změn

Pokud to není nutné, měli byste zakázat sledování změn. Nejdůležitější je, že nepotřebujete sledování změn, když byste chtěli pouze načíst data a aktualizace načtených dat nejsou vůbec potřeba. Následující příkaz můžete použít k zakázání sledování změn nebo ukládání výsledků mezipaměti do mezipaměti, pokud chcete načíst zákazníky z databáze bez nutnosti aktualizace záznamů.

Pokud chcete zakázat sledování objektů pro tabulku Zákazníci, můžete použít následující kód.

PayrollContext kontext = nový PayrollContext ();

Snižte náklady na generování zobrazení pomocí Pre-generovaných zobrazení

Vytvoření ObjectContext je nákladná operace, protože zahrnuje náklady na načtení a ověření metadat. Měli byste využít předem vygenerované pohledy ke snížení doby odezvy při provedení prvního požadavku. V zásadě modul runtime Entity Framework vytvoří sadu tříd (nazývaných také pohled), když je kontext objektu vytvořen poprvé. Tuto režii můžete snížit předběžným vygenerováním pohledu pro soubor EDMX pomocí nástroje příkazového řádku EdmGen.exe nebo šablon T4. Všimněte si, že pokud se změnily soubory schématu modelu, budete muset znovu vygenerovat soubor zobrazení spuštěním souboru EdmGen.exe s příznakem / mode: ViewGeneration. Můžete také předem vygenerovat zobrazení pomocí modelu s prvním kódem.

Zakázat automatickou detekci změn

Při pokusu o aktualizaci databáze potřebuje Entity Framework znát změny, které byly provedeny v entitě od okamžiku, kdy byla načtena do paměti. Tato detekce změn se provádí porovnáním starých hodnot vlastností s novými nebo změněnými hodnotami při volání metod, jako jsou metody Find (), Remove (), Add (), Attach () a SaveChanges (). Tato detekce změn je velmi nákladná a může snížit výkon aplikace primárně, když pracujete s mnoha entitami. Detekci změn můžete zakázat pomocí následujícího kódu.

Pokud chcete deaktivovat detekci změn, je dobrým zvykem ji deaktivovat uvnitř bloku try / catch a poté ji znovu povolit uvnitř bloku finally. Všimněte si, že to můžete ignorovat, když pracujete s relativně malou sadou dat - při práci s velkou sadou dat byste získali výrazné zvýšení výkonu vypnutím detekce změn.

Další body, které je třeba mít na paměti

Pomocí projekcí vyberte pouze pole, která jsou potřebná při načítání dat. Měli byste se vyhnout načítání polí, která nejsou potřeba.

Následující fragment kódu ukazuje, jak můžete načíst data stránkovaným způsobem - všimněte si, jak byl použit počáteční index stránky a velikost stránky k výběru pouze těch dat, která jsou potřeba.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = nový NorthwindEntities ();

Seznam lstCus = dataContext.tblCustomers.Take (pageSize)

.Skip (startingPageIndex * pageSize)

.ToList ();

Měli byste také vybrat příslušnou kolekci a použít zkompilované dotazy ke zlepšení výkonu vašich LINQ dotazů při načítání dat vystavených EDM. Vyhněte se tahání všech databázových objektů v jednom datovém modelu entity. Načíst pouze počet záznamů, které jsou potřeba, a vyhnout se použití "Obsahuje" při použití LINQ na entity. Stránkování můžete použít k načtení pouze dat, která jsou požadována, nebo k omezení množství dat, která jsou načtena z databáze. Také byste měli přidat indexy do svých entit voláním metody CreateIndex ().

Další informace o úvahách o výkonu při použití Entity Framework se můžete dozvědět z tohoto odkazu.