2011-10-26 21 views
8

Ho uno schema strano di tempo di risposta quando si utilizza la comunicazione Entity Framework per SQL.Debug di Entity Framework Istruzioni SQL

Questo è dal mio host web:

enter image description here

Questo è dal mio server locale:

enter image description here

E 'l'aumento del tempo di risposta che mi preoccupa. Ho ridotto il problema a una singola riga nel codice Nop.Data> EfRepository.cs> public void Insert (entità T)> _entities.Add (entity); Sì, lo so molto specifico per il NopCommerce, ma il punto è che sto cercando aiuto su come eseguire il debug di questo.

Ci sono eventi che posso rilevare per visualizzare l'SQL che si sta eseguendo? Oppure quali altre cose posso fare per scoprire di più ciò che sta realmente accadendo in Entity Framework nel comando precedente.

risposta

21

Per il debug di query EF, la cosa più semplice è quello di lanciare la query per ObjectQuery e utilizzare ToTraceString:

var query = myContext.MyTable 
    .Where(r => r.Id == searchId) 
    .Select(r => r); 

Console.WriteLine(((ObjectQuery)query).ToTraceString()); 

Questo mostrerà il codice SQL sottostante per la query, ed è possibile eseguire manualmente le query per eseguire il debug perché sono lenti. Ecco il link MSDN:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

Se si sta cercando di ottenere il codice SQL che viene eseguito quando si chiama SaveChanges() sul contesto, non è così facile. Si potrebbe dare un'occhiata a EFTracingProvider:

http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

Oppure, supponendo che si utilizza SQL Server, si può andare direttamente a SQL Profiler e acquisire le istruzioni T-SQL (questo è il mio approccio preferito).

+0

Grazie, proverò il primo perché la chiamata SaveChanges() non sembra richiedere molto tempo, almeno la riga che ho scritto ha richiesto molto tempo. Non riesco a utilizzare il Profiler (ho provato) a causa di restrizioni sull'host. – Anders

+0

Ho scoperto che parte del problema era all'interno del codice riguardante la trasmissione di oggetti a classi specifiche. Quindi il problema probabilmente non era legato a SQL – Anders

8

In EF6, si può anche fare questo nel costruttore della vostra DbContext

Esempio

public BookServiceContext() : base("name=BookServiceContext") 
{ 
    // New code: 
    this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 
} 

Questo registrerà alla console ogni query SQL EF genera. Vedere questo articolo per ulteriori informazioni http://blog.oneunicorn.com/2013/05/08/ef6-sql-logging-part-1-simple-logging/

Problemi correlati