Best practices om de prestaties van Entity Framework te verbeteren

Het Entity Framework van Microsoft is een uitgebreide ORM waarmee u het objectmodel van uw applicatie kunt isoleren van het datamodel. Het is een open source ORM-framework voor ADO.Net en is opgenomen als onderdeel van .Net Framework. In dit bericht zal ik een paar tips presenteren die kunnen worden gevolgd om de prestaties van Entity Framework te optimaliseren. In de secties die volgen, wil ik een paar tips bespreken die kunnen worden toegepast om de prestaties van applicaties te verbeteren wanneer u met Entity Framework werkt.

Vertegenwoordigt uw entiteitsgegevensmodel een enkele werkeenheid?

Wanneer u uw EDM (Entity Data Model) maakt, moet u ervoor zorgen dat de EDM een enkele werkeenheid vertegenwoordigt en niet de hele database, vooral wanneer u veel objecten (tabellen, opgeslagen procedures, views, enz.) In uw database hebt die niet zijn verbonden. of zijn niet nodig voor een bepaalde werkeenheid. Als uw EDM de volledige database vertegenwoordigt wanneer deze niet nodig is, kan dit de prestaties van de toepassing verminderen omdat er veel onnodige objecten in het geheugen moeten worden geladen. In wezen zou u een gegevensmodel van een grote entiteit moeten opsplitsen in kleinere, waarbij elk model een werkeenheid vertegenwoordigt.

U kunt dit MSDN-artikel raadplegen voor meer informatie over hoe de prestaties van Entity Framework kunnen worden verbeterd.

Schakel het bijhouden van wijzigingen uit

U moet het bijhouden van wijzigingen uitschakelen als dit niet nodig is. Het belangrijkste is dat u het bijhouden van wijzigingen niet nodig hebt wanneer u alleen gegevens wilt ophalen en updates van de gelezen gegevens helemaal niet nodig zijn. U kunt de volgende instructie gebruiken om het bijhouden van wijzigingen uit te schakelen of om het resultaat van een query in de cache op te slaan als u klanten uit de database wilt halen zonder dat u de records hoeft bij te werken.

Als u objecttracering voor de tabel Klanten wilt uitschakelen, kunt u de volgende code gebruiken.

PayrollContext context = new PayrollContext();

Verlaag de kosten voor het genereren van weergaven met behulp van vooraf gegenereerde weergaven

Het maken van ObjectContext is een kostbare operatie omdat het de kosten van het laden en valideren van de metadata met zich meebrengt. U moet profiteren van vooraf gegenereerde weergaven om de reactietijd te verkorten wanneer het eerste verzoek wordt uitgevoerd. In wezen maakt de Entity Framework-runtime een set klassen (ook wel de view genoemd) wanneer de objectcontext voor de eerste keer wordt geïnstantieerd. U kunt deze overhead verminderen door de weergave voor het EDMX-bestand vooraf te genereren met het opdrachtregelprogramma EdmGen.exe of T4-sjablonen. Merk op dat als de schemabestanden van het model zijn gewijzigd, u het weergavenbestand opnieuw moet genereren door EdmGen.exe uit te voeren met de / mode: ViewGeneration-vlag. U kunt ook vooraf weergaven genereren met een code-first-model.

Schakel automatische detectie van wijzigingen uit

Wanneer u de database probeert bij te werken, moet het Entity Framework de wijzigingen kennen die zijn aangebracht in een entiteit vanaf het moment dat deze in het geheugen werd geladen. Deze wijzigingsdetectie wordt gedaan door de oude waarden van de eigenschappen te vergelijken met de nieuwe of gewijzigde waarden wanneer u de methoden zoals Find (), Remove (), Add (), Attach () en SaveChanges () aanroept. Deze wijzigingsdetectie is erg kostbaar en kan de prestaties van de toepassing verminderen, vooral wanneer u met veel entiteiten werkt. U kunt de detectie van wijzigingen uitschakelen met de volgende code.

Als u wijzigingsdetectie wilt uitschakelen, is het een goede gewoonte om het uit te schakelen in een try / catch-blok en het vervolgens weer in te schakelen in het laatste blok. Merk op dat u dit kunt negeren wanneer u met een relatief kleine set gegevens werkt - u zou aanzienlijke prestatieverbeteringen behalen door wijzigingsdetectie uit te schakelen wanneer u met een grote set gegevens werkt.

Andere punten om in gedachten te houden

Gebruik projecties om alleen de velden te selecteren die nodig zijn bij het ophalen van gegevens. U moet voorkomen dat u velden ophaalt die niet nodig zijn.

Het volgende codefragment illustreert hoe u het ophalen van gegevens op een wisselende manier kunt gebruiken - merk op hoe de startpagina-index en het paginaformaat zijn gebruikt om alleen de gegevens te selecteren die nodig zijn.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = new NorthwindEntities();

List lstCus = dataContext.tblCustomers.Take(pageSize)

.Skip(startingPageIndex * pageSize)

.ToList();

U moet ook de juiste verzameling selecteren en gecompileerde query's gebruiken om de prestaties van uw LINQ-query's te verbeteren bij het ophalen van gegevens die door de EDM zijn vrijgegeven. Vermijd het ophalen van alle database-objecten in één entiteitsgegevensmodel. Haal alleen het aantal records op dat nodig is en vermijd het gebruik van "Bevat" wanneer u LINQ naar Entiteiten gebruikt. U kunt paging gebruiken om alleen de gegevens op te halen waarvoor wordt gevraagd of om de hoeveelheid gegevens die uit de database wordt opgehaald, te beperken. U moet ook indexen aan uw entiteiten toevoegen door de CreateIndex () - methode aan te roepen.

Via deze link vindt u meer informatie over de prestatieoverwegingen bij het gebruik van Entity Framework.