实体框架4.0:如何查看SaveChanges方法的SQL语句

LCJ*_*LCJ 30 .net c# entity-framework

我曾经使用context.Log跟踪LINQ to SQL生成的SQL语句,如Sql Server Query Visualizer所示 - 看不到生成的SQL查询

context.Log = new OutputWindowWriter();
Run Code Online (Sandbox Code Playgroud)

对于EF,有什么类似的,像上面的方法一样容易吗?

Ale*_*aus 28

通常,您可以通过简单的方式连接内置跟踪器或任何记录器

context.Database.Log = msg => Trace.WriteLine(msg);
Run Code Online (Sandbox Code Playgroud)

在DbContext构造函数中.在MSDN中查看更多信息.来自MS的一些其他方法在这里(全部基于DataContext.Log属性).

谈到Nate提到的Clutch解决方案,它不适用于EF v6(请参阅此错误报告).

参考

  1. 记录和拦截数据库操作(EF6以上版本)
  2. 记录和拦截数据库操作

  • 对于一个引用实体框架4.0的问题,这里提到的答案怎么能在这里提到,只能在EF 6中使用? (4认同)

Nat*_*ook 14

Clutch.Diagnostics.EntityFramework(在NuGet中可用)非常适合我,它比EFTracingProvider更简单.

EF 6的更新:

从Entity Framework 6开始,只要Entity Framework向数据库发送命令,该命令就可以被应用程序代码拦截.这最常用于记录SQL,但也可用于修改或中止命令.

具体来说,EF包括:
*上下文的Log属性,类似于LINQ to SQL中的DataContext.Log.
*一种机制,用于自定义发送到日志的输出的内容和格式.
*用于拦截的低级构建块提供更大的控制/灵活性.

请参阅http://msdn.microsoft.com/en-US/data/dn469464


Jon*_*upp 6

EF跟踪提供程序可以输出所有SQL语句执行的痕迹.如果需要,您还可以使用它来添加自己的日志记录.这里有一些代码可以放在上下文类的构造函数中(这是针对DBContext的,但使用ObjectContext的调整应该非常明显):

// enable logging all queries executed by EF
var cx = ((IObjectContextAdapter)this).ObjectContext; // change to var cx = this; if using ObjectContext.
cx.EnableTracing();
cx.Connection.GetTracingConnections().ToList().ForEach(
    c =>
    {
        c.CommandExecuting += (s, e) => Log(e);
        c.CommandFailed += (s, e) => Log(e);
        c.CommandFinished += (s, e) => Log(e);
    });
Run Code Online (Sandbox Code Playgroud)