C# DbContext日志未拦截SaveChanges()生成的SQL

C# DbContext日志未拦截SaveChanges()生成的SQL,c#,linq-to-entities,dbcontext,entity-framework-6.1,C#,Linq To Entities,Dbcontext,Entity Framework 6.1,来自MSDN的文章介绍了如何使用Log属性记录SQL,包括EF6+的SaveChanges()方法生成的SQL 我试图截取从DbContext继承的上下文类中生成的所有sql。除了SaveChanges()方法生成的SQL之外,截取对任何东西都可以正常工作 DbContext.Database.Log是用于记录此日志的正确属性吗? using (Context c = new Context()) { //setup logging to debugger c.Database.

来自MSDN的文章介绍了如何使用Log属性记录SQL,包括EF6+的
SaveChanges()
方法生成的SQL

我试图截取从DbContext继承的上下文类中生成的所有sql。除了SaveChanges()方法生成的SQL之外,截取对任何东西都可以正常工作

DbContext.Database.Log是用于记录此日志的正确属性吗?

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();
}
是否有其他方法记录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派生的上下文,它重写了SaveChanges()方法。在被重写的方法中,它将DbContext.Database.Log重新路由到字符串生成器,而不是调试器。

从DbContext派生的上下文正在重写SaveChanges()方法。在重写的方法中,它将DbContext.Database.Log重新路由到字符串生成器,而不是调试器。

我认为它实际上没有保存任何内容<代码>时间戳通常是映射为
计算的
的属性,因此不会更新。尝试更新一些其他属性。我检查了,它确实更新了行。我可以看到上下文包含已更改的实体,当我调用savechanges时,这些更改会传播到数据库中。当然,我也尝试过更改其他属性,但没有显示sql。我终于找到了原因。更新是个问题。谢谢你的帮助@GertArnold