Best Practices zur Verbesserung der Leistung von Entity Framework

Das Entity Framework von Microsoft ist ein erweitertes ORM, mit dem Sie das Objektmodell Ihrer Anwendung vom Datenmodell isolieren können. Es ist ein Open Source ORM-Framework für ADO.Net und ist Teil des .Net Frameworks. In diesem Beitrag werde ich einige Tipps vorstellen, die zur Optimierung der Entity Framework-Leistung befolgt werden können. In den folgenden Abschnitten werde ich einige Tipps untersuchen, die zur Verbesserung der Anwendungsleistung bei der Arbeit mit Entity Framework verwendet werden können.

Stellt Ihr Entitätsdatenmodell eine einzelne Arbeitseinheit dar?

Wenn Sie Ihr EDM (Entity Data Model) erstellen, sollten Sie sicherstellen, dass das EDM eine einzelne Arbeitseinheit und nicht die gesamte Datenbank darstellt, insbesondere wenn Ihre Datenbank viele Objekte (Tabellen, gespeicherte Prozeduren, Ansichten usw.) enthält, die nicht verbunden sind oder werden für eine bestimmte Arbeitseinheit nicht benötigt. Wenn Ihr EDM die gesamte Datenbank darstellt, wenn sie nicht benötigt wird, kann dies die Leistung der Anwendung beeinträchtigen, da viele unnötige Objekte in den Speicher geladen werden müssen. Im Wesentlichen sollten Sie ein großes Entitätsdatenmodell in kleinere aufteilen, wobei jedes Modell eine Arbeitseinheit darstellt.

In diesem MSDN-Artikel finden Sie weitere Informationen dazu, wie die Leistung von Entity Framework verbessert werden kann.

Deaktivieren Sie die Änderungsverfolgung

Sie sollten die Änderungsverfolgung deaktivieren, wenn sie nicht benötigt wird. Am wichtigsten ist, dass Sie keine Änderungsverfolgung benötigen, wenn Sie nur Daten abrufen möchten und Aktualisierungen der gelesenen Daten überhaupt nicht erforderlich sind. Mit der folgenden Anweisung können Sie die Änderungsverfolgung deaktivieren oder das Ergebnis einer Abfrage zwischenspeichern, wenn Sie Kunden aus der Datenbank abrufen möchten, ohne die Datensätze aktualisieren zu müssen.

Wenn Sie die Objektverfolgung für die Customers-Tabelle deaktivieren möchten, können Sie den folgenden Code verwenden.

PayrollContext context = new PayrollContext();

Reduzieren Sie die Kosten für die Ansichtserstellung mithilfe vorgenerierter Ansichten

Die Erstellung von ObjectContext ist eine kostspielige Operation, da die Kosten für das Laden und Überprüfen der Metadaten anfallen. Sie sollten vorgenerierte Ansichten nutzen, um die Antwortzeit bei der Ausführung der ersten Anforderung zu verkürzen. Im Wesentlichen erstellt die Entity Framework-Laufzeit eine Reihe von Klassen (auch als Ansicht bezeichnet), wenn der Objektkontext zum ersten Mal instanziiert wird. Sie können diesen Overhead reduzieren, indem Sie die Ansicht für die EDMX-Datei mit dem Befehlszeilentool EdmGen.exe oder T4-Vorlagen vorab generieren. Beachten Sie, dass Sie, wenn sich die Schemadateien des Modells geändert haben, die Ansichtsdatei neu generieren müssen, indem Sie die Datei EdmGen.exe mit dem Flag / mode: ViewGeneration ausführen. Sie können Ansichten auch mit einem Code-First-Modell vorgenerieren.

Deaktivieren Sie die automatische Erkennung von Änderungen

Beim Versuch, die Datenbank zu aktualisieren, muss das Entity Framework die Änderungen kennen, die an einer Entität seit dem Laden in den Speicher vorgenommen wurden. Diese Änderungserkennung erfolgt durch Vergleichen der alten Werte der Eigenschaften mit den neuen oder geänderten Werten, wenn Sie die Methoden Find (), Remove (), Add (), Attach () und SaveChanges () aufrufen. Diese Änderungserkennung ist sehr kostspielig und kann die Leistung der Anwendung hauptsächlich beeinträchtigen, wenn Sie mit vielen Entitäten arbeiten. Sie können die Änderungserkennung mit dem folgenden Code deaktivieren.

Wenn Sie die Änderungserkennung deaktivieren möchten, empfiehlt es sich, sie in einem Try / Catch-Block zu deaktivieren und dann im finally-Block wieder zu aktivieren. Beachten Sie, dass Sie dies ignorieren können, wenn Sie mit einem relativ kleinen Datensatz arbeiten. Sie würden erhebliche Leistungssteigerungen erzielen, wenn Sie die Änderungserkennung deaktivieren, wenn Sie mit einem großen Datensatz arbeiten.

Weitere Punkte zu beachten

Verwenden Sie Projektionen, um nur die Felder auszuwählen, die beim Abrufen von Daten benötigt werden. Sie sollten vermeiden, nicht benötigte Felder abzurufen.

Das folgende Codeausschnitt zeigt, wie Sie das Abrufen von Daten auf Seitenweise verwenden können. Beachten Sie, dass der Startseitenindex und die Seitengröße verwendet wurden, um nur die benötigten Daten auszuwählen.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = new NorthwindEntities();

List lstCus = dataContext.tblCustomers.Take(pageSize)

.Skip(startingPageIndex * pageSize)

.ToList();

Sie sollten auch die entsprechende Sammlung auswählen und kompilierte Abfragen verwenden, um die Leistung Ihrer LINQ-Abfragen beim Abrufen von Daten zu verbessern, die vom EDM verfügbar gemacht werden. Vermeiden Sie das Abrufen aller Datenbankobjekte in einem Entitätsdatenmodell. Rufen Sie nur die Anzahl der benötigten Datensätze ab und vermeiden Sie die Verwendung von "Enthält", wenn Sie LINQ to Entities verwenden. Sie können Paging verwenden, um nur die Daten abzurufen, die angefordert wurden, oder um die Datenmenge einzuschränken, die aus der Datenbank abgerufen wird. Außerdem sollten Sie Ihren Entitäten Indizes hinzufügen, indem Sie die CreateIndex () -Methode aufrufen.

Weitere Informationen zu den Leistungsaspekten bei Verwendung von Entity Framework finden Sie unter diesem Link.