21

Ich verwende EF6 rc1 mit Code First-Strategie, ohne vorkompilierte Ansichten und das Problem ist: Wenn ich kompilieren und Ausführen der EXE-Anwendung dauert es wie 15 Sekunden, um die erste Abfrage auszuführen (das ist okay, da ich noch an den vorgenerierten Ansichten arbeite). Aber wenn ich Visual Studio 2013 Vorschau verwenden, um die exakt gleiche Anwendung zu debuggen es fast 2 Minuten dauert, bevor die erste Abfrage ausgeführt wird:EF6/Code zuerst: Super langsam während der ersten Abfrage, aber nur in Debug

Dim Context = New MyEntities() 
Dim Query = From I in Context.Itens '' <--- The debug takes 2 minutes in here 
Dim Item = Query.FirstOrDefault() 

Gibt es eine Möglichkeit, diese zusätzliche Zeit zu entfernen? Mache ich hier etwas falsch?

Ps .: Der Kontext selbst ist nicht kompliziert, es ist nur voll mit 200+ Tabellen.

Edit: festgestellt, dass das Problem ist, dass während der Debug-Zeit die EF scheint die Ansichten zu generieren ignoriert die vorgenerierten. den Quellcode von EF Mit entdeckte ich, dass die Eigenschaft:

IQueryProvider IQueryable.Provider 
    { 
     get 
     { 
      return _provider ?? (_provider = new DbQueryProvider(
               GetInternalQueryWithCheck("IQueryable.Provider").InternalContext, 
               GetInternalQueryWithCheck("IQueryable.Provider").ObjectQueryProvider)); 
     } 
    } 

ist, wo die Zeit verbraucht wird. Aber das ist seltsam, da es im debug nur Zeit braucht. Fehle ich hier etwas?

Bearbeiten: Es wurden weitere Informationen gefunden auf die Frage: Mit dem Process Monitor (von Sysinternals) fand ich heraus, dass es die 'desenv.exe' Prozess, der Tonnen von Zeit verbraucht. Genauer gesagt, seine Zeit mit einem "Thread-Exit". Er wiederholt den Thread-Exit-Stack 36 Mal. Ich weiß nicht, ob diese Info sehr nützlich ist, aber ich habe eine '.cvs' mit dem Stack gespeichert, hier ist sein Körper: [...] (Bearbeiten: entfernt den '.cvs'-Body, ich kann es wieder posten durch die Kommentare, wenn jemand wirklich denkt, dass es nützlich sein wird, aber es war verwirrend und zu groß.)

Bearbeiten: Installierte VS2013 Ultimate und Entity Framework 6 RTM. Installierte das Entity Framework Power Tools Beta 4 und verwendete es zum Generieren der Ansichten. Nichts hat sich geändert ... Wenn ich die exe ausführe dauert es 20 Sekunden, wenn ich 'Debugging' starte dauert es 120 Sekunden.

Bearbeiten: Erstellt ein kleines Projekt, um den Fehler zu simulieren: http://sdrv.ms/16pH9Vm Führen Sie einfach das Projekt in der Umgebung und direkt über die EXE, klicken Sie auf die Schaltfläche und vergleichen Sie die Ladezeit.

+0

Dies ist ein häufiges Problem, das EF seit geraumer Zeit geplagt hat, dachte ich, sie es in EF6 ansprechen würden .. aber vielleicht nicht .. Eine Sache EF6 bietet, ist die Möglichkeit, Ihr Modell zu brechen in mehrere Modelle, die Ihre beste Wette sein können. –

+0

http://entityframework.codeplex.com/wikipage?title=Multi-tenant%20Migrations –

+0

Das Brechen in mehreren Kontexten änderte nichts.Alle Kontexte folgen der 'Regel', so dass es fast die gleiche Zeit dauert, sie zu laden, es sei denn, ich lade auf Nachfrage, aber ich muss sie alle laden, da es viele Fremdschlüssel zwischen ihnen gibt. –

Antwort

12

Dies ist ein bekanntes Leistungsproblem in Lazy (die EF verwendet), wenn der Debugger angeschlossen ist. Wir arbeiten gerade an einer Lösung (der aktuelle Ansatz, den wir betrachten, ist die Entfernung von Lazy). Wir hoffen, dieses Update bald in einer Patch-Version zu veröffentlichen. Sie können den Fortschritt dieses Problems auf unserer CodePlex-Website verfolgen - http://entityframework.codeplex.com/workitem/1778.

Weitere Details über die kommende 6.0.2 Patch-Release, das ein Update enthalten wird sind hier - http://blogs.msdn.com/b/adonet/archive/2013/10/31/ef6-performance-issues.aspx

+0

Vielen Dank, da dies ein bekannter Bug ist, werde ich als Antwort markieren und den CodePlex-Workitem verfolgen. –

+2

Dieser Patch hat immer noch Leistungsprobleme für mich. –

-1

Ich weiß nicht, ob Sie die Lösung gefunden zu haben. Aber in meinem Fall hatte ich ähnliche Probleme, die mich fast eine Woche nach dem Ausprobieren verschiedener Vorschläge verschwendet haben. Schließlich habe ich eine Lösung gefunden, indem ich mein web.config auf optimizeCompilations = "true" änderte und die Leistung dramatisch von 15-30 Sekunden auf ungefähr 2 Sekunden verbesserte.

Verwandte Themen