来自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重新路由到字符串构建器,而不是调试器。
答案 0 :(得分:0)
派生自DbContext的Context重写了SaveChanges()方法。在重写方法中,它将DbContext.Database.Log重新路由到字符串构建器,而不是调试器。