Mein EF 4.3.1-Modell hat 200-ungerade Tabellen. Der erste Start ist schrecklich, mehrere Minuten. Ein von DotTrace erfasstes Profil impliziert einige schreckliche Algorithmen/Skalierbarkeitsoptionen tief im Framework, wie die Millionen von Aufrufen zu einer Reihe von Methoden dort unten und die 36 Millionen Aufrufe von IEnumerable.Contains() belegen. Hier ist ein Snippet, das wird alles durch die erste Abfrage in der Datenbank ausgelöst (zukünftige Abfragen tun dies nicht und sind in Ordnung).Initialisierung des Entity Framework ist LANGSAM - was kann ich tun, um es schneller zu laden?
Was kann ich zu meinem Modell tun dies weniger schmerzhaft zu machen? Kann ich das irgendwie vorkompilieren? Besser, kann das EF-Team diese Probleme angehen oder den Rahmen frei zugänglich machen, damit ich es tun kann? Oder zumindest die Schreibweise Warapper
beheben? :)
EDIT: Ein bestimmter EF-Aufruf, der dies auslöst, ist im Grunde var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();
. Auch ein EF Migrations Seed() AddOrUpdate erzeugt effektiv den gleichen Stapel. Je voller Stack-Trace, die ein wenig mehr Kontext geben kann, ist hier: Fuller Stack Trace
EDIT: Einige relevante Links:
- MSDN: Performance Considerations (Entity Framework) (dank @AakashM)
- MSDN: EF Power Tools
- SO: Entity Framework 4.1 for large number of tables (715)
EDIT2: Nun, da sie nur open sourced der Code scheint es, dass diese Zeile:
//Filter the 1:1 foreign key associations to the ones relating the sets used in these cell wrappers.
oneToOneForeignKeyAssociationsForThisWrapper =
oneToOneForeignKeyAssociationsForThisWrapper.Where(
it => (it.AssociationEndMembers.All(endMember => entityTypes.Contains(endMember.GetEntityType()))));
ist derjenige, der etwas Arbeit braucht. Es benutzt einen O (n^2) -Algorithmus, wenn es wahrscheinlich nicht muss, aber ich habe noch nicht genau hingesehen.
EDIT3: Glücklicherweise sieht es aus wie Arbeit in EF6 wird zur Korrektur dieses Code: http://entityframework.codeplex.com/discussions/396130
Können Sie den C# -Beispielcode, der diese Ablaufverfolgung erstellt hat, "porovidieren"? –
@Erik Philips: Sicher (bearbeitete Frage), aber es ist trivial. –
Erste Anlaufstelle sollte sein [Performance Considerations (Entity Framework)] (http://msdn.microsoft.com/en-us/library/cc853327%28v=vs.110%29.aspx), wenn Sie nicht haben war schon dort - überprüfen Sie die Versionsnummer btw – AakashM