DbContext Log不拦截SaveChanges()生成的SQL

时间:2015-11-11 18:17:52

标签: c# linq-to-entities dbcontext entity-framework-6.1

来自MSDN的Logging and Intercepting Database Operations文章描述了使用Log属性记录SQL,包括由SaveChanges()方法为EF6 +生成的SQL。

我试图拦截继承自DbContext的Context类中生成的所有sql。拦截适用于除SaveChanges()方法生成的SQL之外的所有内容。

DbContext.Database.Log是否有用于记录此内容的正确属性?

还有其他方法可以记录SaveChanges()方法生成的SQL吗?

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

更新

我发现了问题所在。我使用的是一个派生自DBContext的Context,它覆盖了SaveChanges()方法。在重写方法中,它将DbContext.Database.Log重新路由到字符串构建器,而不是调试器。

1 个答案:

答案 0 :(得分:0)

派生自DbContext的Context重写了SaveChanges()方法。在重写方法中,它将DbContext.Database.Log重新路由到字符串构建器,而不是调试器。