2016-04-21 13 views
21

W Entity Framework 6, jest to możliwe, aby zobaczyć SQL, który zostanie wykonany na wkładkąprzed zawijających SaveChanges?Entity Framework 6 - W jaki sposób można zobaczyć SQL, który zostanie wygenerowany dla wkładki przed wywołaniem SaveChanges

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

jestem zaznajomiony z jak uzyskać wygenerowany kod SQL dla zapytania przed wykonaniem tak:

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

Kwerenda zwraca IQueryable <> natomiast wkładka zwraca DbSet i nazywając ToString na DbSet po prostu wypisuje standardową nazwę obiektu.

Odpowiedz

13

Inną opcją (jeśli dobrze rozumiem Twoje pytanie), byłoby wykorzystanie implementację IDbCommandInterceptor, która pozornie pozwala kontrolować poleceń SQL, zanim zostaną one zrealizowane (I zabezpieczyć moje słowa ponieważ sam tego nie użyłem).

coś takiego:

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

Zarejestruj się go przy użyciu klasy DBInterception dostępne w EF w kontekstowego statycznym konstruktorze:

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

Działa! Musisz tylko ustawić interceptionContext.Result, a to zatrzyma IO bazy danych. Dzięki! –

+0

is DbInterception nie DbInterceptor – sam

5

użytku dla Interceptors szczegółowo zobaczyć link

dodać to na celu .config plikowi

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

Czy ten dziennik nie zostanie zarejestrowany po wykonaniu faktycznej operacji bazy danych, tj. Po wywołaniu funkcji SaveChanges? –

+0

Tak AFAIK, aby uzyskać więcej informacji, można zobaczyć ten link http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Infrastructure/Interception/DatabaseLogger.cs i zastąpić> IDbConfigurationInterceptor dla niestandardowego logowania – rashfmnb

+0

Moje pytanie jest specyficzne o zobaczeniu SQL przed jego wykonaniem. –

9

nie ma odpowiednika query.ToString() AFAIK. Można ewentualnie użyć DbContext.Database.Log właściwość:

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

Najłatwiej w EF6 Aby mieć kwerendy zawsze pod ręką, bez zmiana kodu polega na dodaniu tego do twojego DbContext, a następnie po prostu sprawdzenie zapytania w oknie wyjściowym w visual studio podczas debugowania.

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

EDIT

LINQPad jest również dobrym rozwiązaniem do debugowania z Linq i może również pokazać zapytań SQL.

+0

Nie mogę mówić o EF6, ale to nie działa w nowym rdzeniu EF. – tnktnk

+0

Zobacz: Rejestrowanie i przechwytywanie operacji bazy danych Entity Framework (od EF6) tutaj: https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan