Подтвердить что ты не робот

Entity Framework 6 - Как я могу просмотреть SQL, который будет создан для вставки, перед вызовом SaveChanges

В Entity Framework 6 можно просмотреть SQL, который будет выполнен для вставки, прежде чем вызывать SaveChanges?

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

Я знаком с тем, как получить сгенерированный SQL для запроса до выполнения следующим образом:

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

Запрос возвращает IQueryable < > , тогда как вставка возвращает DbSet и вызов ToString на DbSet просто печатает стандартное имя объекта.

4b9b3361

Ответ 1

Другой вариант (если я правильно понял ваш вопрос), должен был бы использовать реализацию IDbCommandInterceptor, которая, по-видимому, позволяет вам проверять SQL команды, прежде чем они будут выполнены (я хеджирую свои слова, поскольку я не использовал это сам).

Что-то вроде этого:

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

Зарегистрируйте его с помощью класса DBInterception, доступного в EF в вашем статическом конструкторе контекста:

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

Ответ 2

Самый простой способ в EF6 Чтобы запрос всегда был полезен, без изменения кода нужно добавить это в свой DbContext, а затем просто проверить запрос в окне вывода в visual studio при отладке.

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

ИЗМЕНИТЬ

LINQPad также является хорошим вариантом для отладки Linq с помощью и может также отображать SQL-запросы.

Ответ 3

Нет эквивалента query.ToString() AFAIK. В конечном итоге вы можете использовать свойство 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();

Ответ 4

Использование перехватчиков для получения подробной информации см. в этой ссылке

добавить это в файл .config

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