c# - query - Entity Framework 6-¿Cómo puedo ver el SQL que se generará para una inserción antes de llamar a SaveChanges?
insertar registro entity framework c# (4)
La forma más fácil en EF6 Tener la consulta siempre a mano, sin cambiar el código es agregar esto a su DbContext y luego verificar la consulta en la ventana de resultados en Visual Studio, mientras se realiza la depuración.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.Log = (query)=> Debug.Write(query);
}
EDITAR
LINQPad también es una buena opción para depurar Linq y también puede mostrar las consultas SQL.
En Entity Framework 6, ¿es posible ver el SQL que se ejecutará para una inserción antes de llamar a SaveChanges?
using (var db = new StuffEntities()){
db.Things.Add(new Thing({...});
//can I get the SQL insert statement at this point?
db.SaveChanges();
}
Estoy familiarizado con cómo obtener el SQL generado para una consulta antes de la ejecución, por lo que:
var query = db.Thing.Where(x => x.ID == 9);
Console.WriteLine(query.ToString());
//this prints the SQL select statement
La consulta devuelve un IQueryable <> mientras que una inserción devuelve un DbSet y llamar a ToString en un DbSet simplemente imprime el nombre del objeto estándar.
No hay un equivalente de la query.ToString()
AFAIK. Eventualmente puede usar la propiedad DbContext.Database.Log
:
db.Database.Log = s =>
{
// You can put a breakpoint here and examine s with the TextVisualizer
// Note that only some of the s values are SQL statements
Debug.Print(s);
};
db.SaveChanges();
Otra opción (si entiendo su pregunta correctamente), sería usar una implementación de IDbCommandInterceptor
, que aparentemente le permite inspeccionar los comandos SQL antes de que se ejecuten (cedo mis palabras porque no lo he usado yo mismo).
Algo como esto:
public class CommandInterceptor : IDbCommandInterceptor
{
public void NonQueryExecuting(
DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
// do whatever with command.CommandText
}
}
Regístrelo utilizando la clase DBInterception
disponible en EF en su contexto constructor estático:
static StuffEntities()
{
Database.SetInitializer<StuffEntities>(null); // or however you have it
System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new CommandInterceptor());
}
Usa Interceptores para más detalles ver este link
agrega esto al archivo .config
<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:/Temp/LogOutput.txt"/>
</parameters>
</interceptor>
</interceptors>