2011-10-26 23 views
8

Tengo un patrón extraño de tiempo de respuesta cuando uso Entity Framework para la comunicación SQL.Debugging Entity Framework Sentencias SQL

Esto es de mi proveedor de alojamiento web:

enter image description here

Esto es de mi servidor local:

enter image description here

Es el aumento en el tiempo de respuesta que me preocupa. He reducido el problema a una sola línea en el código Nop.Data> EfRepository.cs> public void Insert (entidad T)> _entities.Add (entidad); Sí, sé esto muy específico para NopCommerce, pero el hecho es que estoy buscando ayuda sobre cómo depurar esto.

¿Hay algún evento que pueda detectar que muestre el SQL que se está ejecutando? O qué otras cosas puedo hacer para averiguar más sobre lo que está sucediendo realmente en Entity Framework en el comando anterior.

Respuesta

21

Para depurar consultas EF, lo más fácil es echar la consulta a ObjectQuery y utilizar ToTraceString:

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

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

Esto mostrará el SQL subyacente para la consulta, y se puede ejecutar las consultas de forma manual para depurar qué son lentos Aquí está el enlace de MSDN:

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

Si usted está tratando de obtener el SQL que se ejecuta cuando se llama SaveChanges() en su contexto, no es tan fácil. Se podría echar un vistazo a EFTracingProvider:

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

O, suponiendo que el uso de SQL Server, puede ir directamente a SQL y capturar las instrucciones T-SQL (este es mi método preferido).

+0

Gracias, voy a probar el primero porque la llamada SaveChanges() no parece tomar tanto tiempo, al menos la línea que escribí tomó mucho tiempo. No puedo usar el Analizador (probé) debido a restricciones en el host. – Anders

+0

Descubrí que parte del problema estaba dentro del código relacionado con el envío de objetos a clases específicas. Entonces, el problema probablemente no estaba relacionado con SQL – Anders