2016-04-21 20 views
21

In Entity Framework 6, è possibile visualizzare l'SQL che verrà eseguito per un insertoprima SaveChanges chiamata?Entity Framework 6 - Come faccio a visualizzare il codice SQL che verrà generato per un inserto prima di chiamare SaveChanges

using (var db = new StuffEntities()){ 
    db.Things.Add(new Thing({...}); 
    //can I get the SQL insert statement at this point? 
    db.SaveChanges(); 
} 

ho familiarità con il modo di ottenere il codice SQL generato per un interrogazione prima dell'esecuzione in questo modo:

var query = db.Thing.Where(x => x.ID == 9); 
Console.WriteLine(query.ToString()); 
//this prints the SQL select statement 

La query restituisce un IQueryable <> mentre un inserto restituisce un DbSet e chiamando ToString su un DbSet stampa semplicemente il nome dell'oggetto standard.

risposta

13

Un'altra opzione (se ho capito bene la tua domanda), sarebbe quella di utilizzare un IDbCommandInterceptor implementazione, che permette apparentemente di ispezionare i comandi SQL prima di essere eseguiti (I Hedge le mie parole come non l'ho usato io stesso).

Qualcosa di simile a questo:

public class CommandInterceptor : IDbCommandInterceptor 
{ 
    public void NonQueryExecuting(
     DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     // do whatever with command.CommandText 
    } 
} 

registrarlo utilizzando la classe DBInterception disponibile in EF nel vostro contesto costruttore statico:

static StuffEntities() 
{ 
    Database.SetInitializer<StuffEntities>(null); // or however you have it 
    System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new CommandInterceptor()); 
} 
+0

Funziona! Devi solo impostare interceptionContext.Result e fermerà il database IO. Grazie! –

+0

è DbInterception not DbInterceptor – sam

5

uso intercettori per dettagli vedi questo link

aggiungere questo per .config file di

<interceptors> 
    <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
    <parameters> 
     <parameter value="C:\Temp\LogOutput.txt"/> 
    </parameters> 
    </interceptor> 
</interceptors> 
+0

Questo registro non verrà eseguito solo dopo l'esecuzione dell'operazione di database effettiva, vale a dire dopo aver chiamato SaveChanges? –

+0

sì AFAIK per ulteriori informazioni è possibile visualizzare questo collegamento http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Infrastructure/Interception/DatabaseLogger.cs e sostituire> IDbConfigurationInterceptor per la registrazione personalizzata – rashfmnb

+0

La mia domanda è specifica su come vedere l'SQL prima che venga eseguito. –

9

Non v'è alcun equivalente del query.ToString() AFAIK. È infine possibile utilizzare DbContext.Database.Log proprietà:

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(); 
13

Il modo più semplice in EF6 Per avere la query sempre a portata di mano, senza cambiare codice è aggiungere questo al tuo DbContext e quindi basta controllare la query sulla finestra di output in Visual Studio, mentre esegui il debug.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    Database.Log = (query)=> Debug.Write(query); 
} 

EDIT

LINQPad è anche una buona opzione per eseguire il debug di Linq con e può anche mostrare le query SQL.

+0

Non riesco a parlare per EF6, ma questo non sembra funzionare nel nuovo core EF. – tnktnk

+0

Vedere: Entity Framework Registrazione e intercettazione delle operazioni di database (EF6 in poi) qui: https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan