Ich habe kürzlich mein Entity-Modell von einem ObjectContext mit 4.1 zu einem DbContext mit 5.0 verschoben. Ich beginne zu bereuen dies zu tun, weil ich eine sehr schlechte Leistung bei der Abfrage mit dem DbContext vs ObjectContext bemerke. Hier ist das Testszenario:DbContext Abfrage Leistung schlecht vs ObjectContext
Beide Kontexte verwenden die gleiche Datenbank mit etwa 600 Tabellen. LazyLoading und ProxyCreation sind für beide deaktiviert (nicht im Codebeispiel gezeigt). Beide haben vorgenerierte Ansichten.
Der Test führt zunächst einen Aufruf zum Laden des Metadatenarbeitsbereichs durch. Dann führe ich in einer for-Schleife, die 100 Mal ausgeführt wird, einen Kontext neu aus und führe einen Aufruf aus, der die ersten 10 aufruft. (Ich erstelle den Kontext in der for-Schleife, da dies in einem WCF-Dienst verwendet wird jedes Mal) der Kontext
for (int i = 0; i < 100; i++)
{
using (MyEntities db = new MyEntities())
{
var a = db.MyObject.Take(10).ToList();
}
}
Als ich betreibe diese mit dem Object es etwa 4,5 Sekunden dauert. Wenn ich es mit dem DbContext starte, dauert es etwa 17 Sekunden. Ich profilierte dies mit RedGate Performance-Profiler. Für den DbContext scheint der Hauptschuldiger eine Methode namens UpdateEntitySetMappings zu sein. Dies wird bei jeder Abfrage aufgerufen und scheint den Metadatenarbeitsbereich abzurufen und alle Elemente im OSpace durchlaufen zu lassen. AsNoTracking hat nicht geholfen.
EDIT: Um ein besseres Detail zu geben, hat das Problem mit der Erstellung \ Initialisierung eines DbSet vs ein ObjectSet, nicht die eigentliche Abfrage zu tun. Wenn ich mit dem ObjectContext einen Aufruf mache, dauert es im Durchschnitt 42ms, um das ObjectSet zu erstellen. Wenn ich mit dem DbContext aufrufe, dauert es etwa 140ms, um das interne dbset zu erstellen. Sowohl ObjectSet als auch DbSet führen einige Entitätsgruppen-Mapping-Suchen aus dem Metadatenarbeitsbereich aus. Was ich bemerkt habe, ist, dass das DbSet dies für ALLE Typen im Arbeitsbereich tut, während das ObjectSet dies nicht tut. Ich vermute (habe es nicht ausprobiert), dass ein Modell mit weniger Tabellen weniger Leistungsdifferenz hat.