2012-05-25 11 views
36

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?

enter image description here

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:

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

+1

Können Sie den C# -Beispielcode, der diese Ablaufverfolgung erstellt hat, "porovidieren"? –

+0

@Erik Philips: Sicher (bearbeitete Frage), aber es ist trivial. –

+2

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

Antwort

22

In prä EF6 Ansicht Generation bekannt ist für größere Modelle langsam. Die Lösung besteht derzeit darin, vorgenerierte Ansichten zu verwenden. Auf diese Weise generieren Sie Ansichten zur Entwurfszeit und vermeiden diese Arbeit zur Laufzeit. Um dies zu tun, laden Sie EF Power Tools herunter und wählen Sie "Entity Data Model optimieren". Es fügt Ihrem Projekt, das Ansichten enthält, eine C# -Datei hinzu. Der Nachteil ist, dass Sie es jedes Mal tun müssen, wenn sich Ihr Modell ändert. Hinweis: Um Ansichten mit dem Werkzeug zu erzeugen, wird es ungefähr die gleiche Zeit benötigen, um Ansichten zur Laufzeit zu erzeugen (manchmal müssen Sie also etwas Geduld haben). Hier ist ein Beitrag über EF Power Tools, die hilfreich sein könnten: http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx

bearbeiten

Vor kurzem habe ich eine andere Lösung geschaffen, die viel bequemer zu bedienen ist (beachten Sie, es funktioniert nur auf EF6) - http://blog.3d-logic.com/2013/12/14/using-pre-generated-views-without-having-to-pre-generate-views-ef6/

+0

Danke, ich werde das untersuchen und versuchen, die Ergebnisse hier zu posten. Denkst du, dass es Software-Verbesserungen gibt, die in zukünftigen Versionen vorgenommen werden können, um diesen Prozess zu beschleunigen, oder gibt es einfach zu viel zu berechnen, und es ist so optimiert, wie es wird (was bedeutet, dass ich die Dinge aufteilen muss)? –

+0

Wir suchen nach Möglichkeiten, um es besser zu machen. – Pawel

+0

Froh, es zu hören! Viel Glück ... gerne Unterstützung geben wenn möglich. –

12

Hier ist eine andere Möglichkeit, es zu tun. Es erfordert ein wenig manuelle Arbeit, kann aber eher für Ihr Szenario geeignet sein, in dem Sie MsBuild verwenden möchten. Anstatt Ansichten mit Power Tools zu erstellen (es tut mir leid zu hören, dass sie nicht für Sie funktionierten) können Sie sie manuell erstellen - hier sind die Schritte:

  • Zuerst müssen Sie Artefakte für Ihren Kontext erhalten. Sie benötigen alle - csdl-, ssdl- und msl-Dateien. Sie können EdmxWriter verwenden, um diese zu erhalten. Beachten Sie, dass EdmxWriter eine edmx-Datei zurückgibt, die alle drei Dateien kombiniert, so dass Sie sie teilen müssen.Hier ist der Code für diesen Schritt (Beachten Sie, dass Namespaces spezifisch für EF4 sind. Wenn Sie EF5 und .NET Framework 4.5 verwenden, müssen Sie diese entsprechend ändern oder Elemente nur nach lokalem Namen und nicht nach dem vollständig qualifizierten Namen auswählen):
  • 
        var ms = new MemoryStream(); 
        using (var writer = XmlWriter.Create(ms)) 
        { 
         EdmxWriter.WriteEdmx(new Context(), writer); 
        } 
    
        ms.Position = 0; 
    
        var xDoc = XDocument.Load(ms); 
    
        var ssdl = xDoc.Descendants("{http://schemas.microsoft.com/ado/2009/02/edm/ssdl}Schema").Single(); 
        var csdl = xDoc.Descendants("{http://schemas.microsoft.com/ado/2008/09/edm}Schema").Single(); 
        var msl = xDoc.Descendants("{http://schemas.microsoft.com/ado/2008/09/mapping/cs}Mapping").Single(); 
    
        ssdl.Save("Context.ssdl"); 
        csdl.Save("Context.csdl"); 
        msl.Save("Context.msl"); 
    
    • Wenn Sie Artefakte haben Sie Ansichten mit EdmGen Tool generieren können. Da wir es hier manuell tun, müssen Sie es über die VS-Eingabeaufforderung tun. Hier ist der Befehl, den Sie verwenden, um Ansichten zu generieren:
    EdmGen /mode:ViewGeneration /incsdl:Context.csdl /inmsl:Context.msl /inssdl:Context.ssdl /outviews:Context.Views.cs
    +0

    Actully jetzt nach dem Posten dieser Idee denke ich über die Erstellung von T4-Vorlagen für CodeFirst ... Bleiben Sie dran. – Pawel

    +0

    Ich erstellte Ansicht gen T4 Vorlagen für Code zuerst. Der Link ist in meinem Blog-Post: http://blog.3d-logic.com/2012/05/28/entity-framework-code-first-and-pre-generated-views/ – Pawel

    +1

    Pawel aktuellen Link zu C# T4-Vorlage ist: http://visualstudiogallery.msdn.microsoft.com/ae7730ce-ddab-470f-8456-1b313cd2c44d –

    1

    View Generation ist in der aktuellen Version von Entity Framework in der Tat ziemlich schnell. (6.1) Es gibt eine andere, breitere Caching-Lösung in Vorbereitung: https://entityframework.codeplex.com/workitem/1876. Sie können darauf warten, dass dieser Patch akzeptiert wird, oder Sie können ihn selbst anwenden, wenn Sie mutig genug sind.

    Verwandte Themen