2012-06-22 17 views
11

Ich frage mich, ob es möglich ist, die erste Abfrage mit EF-Code zuerst zu beschleunigen.Entity Framework Startzeit

Ich habe ein kleines Testprogramm mit einer Einheit mit 2 Feldern, und die erste Abfrage dauert 2,2 Sekunden, die zweite Abfrage (die genau das gleiche ist) dauert 0,006 Sekunden.

Ich bin schon Vorkompilieren die Ansicht, so dass wont hier helfen. Ich denke, das Problem ist, dass es einige Zeit braucht, um das Modell im Speicher zu konstruieren, aber sollte es so lange dauern? Und gibt es eine Möglichkeit, dieses Modell so vorzukompilieren, wie es mit den Ansichten ist?

+1

Denken Sie nicht, dass es möglich ist, aber ich kann falsch liegen. Schauen Sie sich diese Frage zu verstehen, was während der ersten Abfrage geschieht http://stackoverflow.com/questions/5634338/ef-4-1-code-first-onmodelcreating-call-time –

+0

@ RaphaëlAlthaus Sie könnten Recht haben:/Es ist einfach seltsam .. Sie können Ihr eigenes Modell erstellen, indem Sie die DbModelBuilder-Klasse verwenden und dann die Build-Methode für dieses Objekt aufrufen. Daher sollte es möglich sein, dies bei Compiletime statt Runtime zu tun. Aber vielleicht ist es einfach nicht implementiert. – nyhjem

+0

Es kann einige Zeit dauern, die Kompatibilität des Datenbankschemas zu überprüfen. Sie können dies überprüfen, indem Sie den SQL-Profiler verwenden. –

Antwort

5

diesen Artikel: Squash Entity Framework startup time with pre-compiled views beschreibt eine Lösung im Detail.

Es geht mit der Optimieren Entity Data Model Option in Entity Framework Power Tool eine vorkompilierte Datei .Views Klasse zu generieren.

+4

Ich habe das schon ausprobiert, aber jetzt habe ich die Schritte in dem Artikel verfolgt, mit dem Sie verlinkt sind. Die Ansicht wird generiert, aber der erste Zugriff ist immer noch sehr langsam. Ich habe einen kleinen Test gemacht. Zuerst greife ich auf die Datenbank mit einer ordenären SqlConnection und SqlCommand zu. Es dauert 0,2 Sekunden. Gleich danach benutze ich EF und mache etwas ähnliches (con.Users.Count();). Dies dauert 3,08 Sekunden ..! Dann laufe ich die exakt gleiche Code-Zeile wieder, und von nun an dauert es nur 0,007 sec .. So klar ist EF etwas zu tun, außer Ansichten zu erzeugen, wenn Sie die Datenbank zum ersten Mal zugreifen .. – nyhjem

4

Wenn Sie Ihre erste Abfrage erstellen, initialisiert EF sich selbst und das dauert einige Zeit. Ich denke nicht, dass es viel zu tun gibt, um EFs Infrastrukturinitialisierung zu beschleunigen, aber wenn Sie wirklich die erste Anfrage beschleunigen wollen und nicht die Initialisierung von EF selbst, dann können Sie versuchen EF zu initialisieren vor mit Ihrer ersten Abfrage.

 using (var db = new MyContext()) 
     { 
      db.Database.Initialize(force: true); 
     } 
+3

force = true Willen, Nun, erzwinge die Reinitialisierung, auch wenn die Infra-Struktur/Interna schon vorher initialisiert wurde, also verwende force: true, es sei denn, du hast die Verbindungszeichenfolge oder Tabellenstrukturen geändert. –