2012-07-18 11 views
8

Ho ~ 300 DbSets nel mio contesto e la prima query dopo il caricamento dell'app (un FirstOrDefault() dove su un campo indicizzato) richiede ~ 40 secondi.Perché il mio codice EF Le prime visualizzazioni pregenerate non hanno alcun effetto?

di migliorare questo, sto cercando di utilizzare le visualizzazioni pregenerati in EF 4.3.1 primo codice utilizzando il modello T4 qui:

http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

compilo in, ma non vedo differenza di prestazioni. Speravo/presumendo che avrebbe aiutato il doloroso avvio lento che sto vivendo, ma senza fortuna.

Dovrebbe essere d'aiuto? In caso contrario, a cosa servono esattamente le viste pregenerate? E, c'è qualcosa che io posso fare fare per migliorare il tempo di avvio? Spaccare il mio contesto è doloroso per non dire altro.

+0

C'è qualcosa di strano con le viste precompilate in ASP.NET. Ho avuto lo stesso problema. – jrummell

risposta

5

Si scopre che in realtà sembra cercare le viste pregenerate nell'assieme in cui la prima entità di riferimento è, non nell'assembly in cui si trova DbContext. Vedi ulteriori discussioni qui: http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/#comment-76.

Per risolvere il problema, ho creato una nuova entità e l'ho inserita nell'assembly del contesto e l'ho elencata come primo DbSet. Ora lo raccoglie e funziona bene (tranne che è ridicolo).

+2

Questo comportamento esiste anche con Database e Model First. Le mie viste pre-generate sono compilate con il contesto nello stesso assembly. Vengono raccolti in una console o un'applicazione di servizio Windows, ma non in IIS. Sono in grado di vederlo perché sto usando un T4 per generarli e ho aggiunto il registro. –

+1

hanno lo stesso problema ma non capisco la soluzione. Ho un asseblby con le mie entità POCO e un altro assembly con il mio edmx. Devo creare un'entità nel mio assieme che abbia l'edmx? Come l'ho elencato come il primo DBContext? Grazie. –

5

Alcuni ORM come NHibernate e EF sono semplicemente lenti per l'avvio. Invece di cercare di "aggiustare" questa lentezza, mi piace eliminare il problema assicurandomi che IIS attivi questo codice ogni volta che si avvia il pool di app. Per risolvere il problema, è necessario configurare IIS per l'avvio automatico del pool di applicazioni. Questa soluzione è disponibile solo per .NET 4 e IIS7.5 e successivi.

si desidera implementare una classe con IProcessHostPreloadClient che carica un ObjectContext e configurare l'applicazione per utilizzare con l'aggiunta di un nodo serviceAutoStartProviders al tuo web.config e l'impostazione startMode = "AlwaysRunning" per la vostra piscina applicazioni app.

Per ulteriori dettagli, fare riferimento a Scott Gu's blog.

+0

Questa è una buona soluzione, ma io, per ragioni dolorosamente fuori dal mio controllo, sono bloccato su IIS6/32 bit Window Server 2003, quindi non ho modo di usare IProcessHostPreloadClient e il sito ricicla da mezzogiorno fuori dai ricordi tutto il tempo ... –

+0

Riciclare regolarmente non è un problema. L'approccio si limita semplicemente a far ripartire il pool di app, mentre il comportamento normale è che non si avvia fino a quando arriva una chiamata. L'IIS6 sarebbe comunque un dealbreaker. L'auto-hosting in un servizio Windows è un'opzione? – Mithon

+0

Si tratta di un problema: un utente sta utilizzando il sito, un riciclo viene attivato, la sua richiesta successiva passa al nuovo pool di app e ciò richiede un tempo indefinito, facendo apparire che il sito sia bloccato. –

Problemi correlati