Entity framework molto lento da caricare per la prima volta dopo ogni compilazione

Come suggerisce il titolo sto avendo un problema con la prima query su un database SQL Server usando Entity Framework. Ho provato a cercare una risposta, ma nessuno sembra avere una soluzione a questo.

I test sono stati eseguiti in Visual Studio 2012 utilizzando Entity Framework 6, inoltre ho utilizzato il modello di visualizzazioni T4 per la precompilazione delle viste. Il database era su uno SQL Server 2008. Abbiamo circa 400 POCO (400 file di mapping), solo 100 file di dati nella tabella del database.

Dopo la cattura è il mio codice di prova e il risultato.

static void Main(string[] args){ Stopwatch st=new Stopwatch(); st.Start(); new TestDbContext().Set.FirstOrDefault(); st.stop(); Console.WriteLine("First Time "+st.ElapsedMilliseconds+ " milliseconds"); st.Reset(); st.Start(); new TestDbContext().Set.FirstOrDefault(); st.stop(); Console.WriteLine("Second Time "+st.ElapsedMilliseconds+ " milliseconds"); } 

Risultati del test

 First Time 15480 milliseconds Second Time 10 milliseconds 

Alla prima query EF compila il modello. Questo può richiedere del tempo serio per un modello così grande.

Ecco 3 suggerimenti: http://www.fusonic.net/en/blog/2014/07/09/three-steps-for-fast-entityframework-6.1-first-query-performance/

Un sumrio:

  1. Utilizzo di un archivio modello db memorizzato nella cache
  2. Genera viste precompilate
  3. Genera la versione precompilata di entityframework usando n-gen per evitare jitting

Mi assicurerei inoltre di compilare l’applicazione in modalità di rilascio quando eseguo i benchmark.

Un’altra soluzione è quella di dividere il DBContext. 400 entity framework sono molte e dovrebbe essere più bello lavorare con pezzi più piccoli. Non l’ho provato, ma suppongo che sarebbe ansible build i modelli uno per uno, il che significa che nessun carico singolo richiede 15 secondi. Vedi questo post di Julie Lerman https://msdn.microsoft.com/en-us/magazine/jj883952.aspx

questo lavoro per me:

 using (MyEntities db = new MyEntities()) { db.Configuration.AutoDetectChangesEnabled = false; // <----- trick db.Configuration.LazyLoadingEnabled = false; // <----- trick DateTime Created = DateTime.Now; var obj = from tbl in db.MyTable where DateTime.Compare(tbl.Created, Created) == 0 select tbl; dataGrid1.ItemsSource = obj.ToList(); dataGrid.Items.Refresh(); } 

Puoi provare qualcosa del genere: (ha funzionato per me)

 protected void Application_Start() { Start(() => { using (EF.DMEntities context = new EF.DMEntities()) { context.DMUsers.FirstOrDefault(); } }); } private void Start(Action a) { a.BeginInvoke(null, null); } 

Entity Framework: prima query lenta

Penso che non sia un’ottima soluzione. Ado.net sembra molto più performante. Tuttavia, questa è la mia opinione.

In alternativa guardali.

https://msdn.microsoft.com/tr-tr/data/dn582034

https://msdn.microsoft.com/en-us/library/cc853327(v=vs.100).aspx