2012-06-22 10 views
11

Mi chiedo se sia possibile accelerare prima la prima query effettuata con il codice EF.Ora di avvio del framework Entity

Ho eseguito un piccolo programma di test con un'entità contenente 2 campi e la prima query impiega 2,2 secondi, la seconda query (che è la stessa esatta) impiega 0,006 secondi.

Sto già precompilando la vista, in modo che non aiuti qui. Penso che il problema sia che ci vuole del tempo per modellare il modello in memoria, ma dovrebbe impiegarci tanto? E c'è un modo per precompilare questo modello come c'è con le viste?

+1

Non credo sia possibile, ma potrei sbagliarmi. Guarda questa domanda per capire cosa succede durante la prima query http://stackoverflow.com/questions/5634338/ef-4-1-code-first-onmodelcreating-call-time –

+0

@ RaphaëlAlthaus Potresti avere ragione:/È solo strano .. Puoi costruire il tuo modello usando la classe DbModelBuilder e poi chiamando il metodo Build su quell'oggetto, quindi dovrebbe essere possibile farlo a compiletime invece di runtime .. Ma forse non è implementato. – nyhjem

+0

Potrebbe essere necessario del tempo per verificare la compatibilità dello schema del database. È possibile controllare questo utilizzando SQL Profiler. –

risposta

5

Questo articolo: Squash Entity Framework startup time with pre-compiled views descrive una soluzione in dettaglio.

Si tratta di utilizzare l'Optimize Entity Data Model opzione in Entity Framework Power Tools per generare un file di classe pre-compilati .Views.

+4

L'ho già provato, ma ora ho seguito i passaggi nell'articolo a cui ti sei collegato. La vista viene generata, ma quel primo accesso è ancora molto lento. Ho fatto un piccolo test. Per prima cosa accedo al database con un ordinamento SqlConnection e SqlCommand. Ci vogliono 0,2 secondi. Subito dopo utilizzo EF e faccio qualcosa di simile (con.Users.Count();). Questo richiede 3.08 sec ..! Quindi eseguo di nuovo la stessa riga di codice e da ora in poi ci vogliono solo 0,007 secondi. Quindi chiaramente EF sta facendo qualcosa di diverso da generare viste quando si accede al database per la prima volta .. – nyhjem

4

Quando si effettua la prima query, EF si inizializza automaticamente e ciò richiede un po 'di tempo. Non penso che ci sia molto da fare per accelerare l'inizializzazione dell'infrastruttura di EF, ma, se quello che cerchi davvero è accelerare la prima query che fai e non l'inizializzazione di EF stessa, beh, puoi provare a forzare EF a inizializzare prima del in esecuzione la prima query.

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

force = true will, beh, forza la reinizializzazione anche se prima era già inizializzata la sua infrastruttura/struttura interna, quindi non usare la forza: true a meno che tu non abbia cambiato la stringa di connessione o le strutture di tabella. –