registro query insertar framework debug c# entity-framework

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>