2015-11-11 4 views
0

В статье Logging and Intercepting Database Operations из MSDN описывается использование свойства Log для ведения журнала SQL, включая SQL, сгенерированный методом SaveChanges() для EF6 +.DbContext Log не перехватывает SaveChanges() Сгенерированный SQL

Я пытаюсь перехватить все сгенерированные sql из моего класса Context, который наследуется от DbContext. Перехват отлично работает для всего, кроме SQL, который генерируется методом SaveChanges().

Является ли DbContext.Database.Log правильным свойством для его использования?

Есть ли другой способ регистрации SQL, сгенерированного методом SaveChanges()?

using (Context c = new Context()) 
{ 
    //setup logging to debugger 
    c.Database.Log = s => Debug.WriteLine(s); 

    //generate query 
    var query = c.SomeTable.Where(x => x.Abc == "A" && x.Zyx == "Z"); 

    //enumerate query - generated SQL is logged to debugger correctly 
    var items = query.ToList(); 

    //modify entities 
    items.ForEach(t => t.Timestamp = DateTime.Now); 

    //get number of changed entities: Outputs "Number of Changed Entities: 3" 
    var changedEntries = c.ChangeTracker.Entries().Where(e => e.State != EntityState.Unchanged); 
    Debug.WriteLine("Number of Changed Entities: {0}", changedEntries.Count()); 

    //save changes - generated SQL is NOT logged to debugger 
    c.SaveChanges(); 
} 

UPDATE

Я узнал, где проблема. Я использовал контекст, который был получен из DBContext и который переопределил метод SaveChanges(). Внутри переопределенного метода он перенаправлял DbContext.Database.Log в построитель строк вместо отладчика.

+0

Я думаю, что это на самом деле ничего не спасает. «Timestamp» обычно является свойством, которое отображается как «Computed», поэтому оно не обновляется. Попробуйте обновить другое свойство. –

+0

Я проверил, и он действительно обновляет строки. Я вижу, что контекст содержит сущности, которые изменились, и изменения распространяются на базу данных, когда я вызываю изменения сохранения. Разумеется, я также попытался изменить другие свойства, но не отображается sql. – Brino

+0

Я нашел причину, наконец. Обновление вопроса. Спасибо за вашу помощь @GertArnold – Brino

ответ

0

Контекст, который происходит из DbContext, переопределяет метод SaveChanges(). Внутри переопределенного метода он перенаправлял DbContext.Database.Log в построитель строк вместо отладчика.

Смежные вопросы