33

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

context.Log = new OutputWindowWriter();

对于 EF,有没有类似上述方法的类似和简单的方法?

4

6 回答 6

30

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

context.Database.Log = msg => Trace.WriteLine(msg);

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

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

参考

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

于 2014-06-02T04:08:36.387 回答
14

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

EF 6 的更新:

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

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

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

于 2013-06-22T20:06:16.900 回答
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);
    });
于 2012-07-20T12:36:15.243 回答
2

对此有很多解决方案,但最简单的代码是在 LINQ 语句的 IQueryable 上调用 ToString()。

var query = db.Employees.Where(x => x.ID = 1); //query will be an IQueryable object
var  sql = query.ToString();

这仅在 EF4.1 上(以前在 ObjectQuery 上调用 ToTraceString 是实现此目的的方法)。

于 2012-07-20T12:42:01.457 回答
2

扩展 Nate 对 EF6 的回答,NLogCommandInterceptorLogging and Intercepting Database Operations中看到的仅显示 CommandText。

如果有一些特定的参数值导致该 commandText 失败,则参数值不会发送到日志中。就我而言,我想记录导致外键违规的值。

这可以通过LogIfError像这样改变 NLogCommandInterceptor 的方法来改进

private void LogIfError<TResult>(DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
{
    if (interceptionContext.Exception != null)
    {
        var commandDumper = new DbCommandDumper(command);
        Log.Warn(Command failed:\r\n{0}", commandDumper.GetLogDump());
        // Exception will get logged further up the stack
    }
}

其中DbCommandDumper类将 DbCommand 重构为可以重放到测试数据库中的 TSQL。

于 2014-07-25T11:11:26.347 回答
1

我相信您可以使用您拥有的 ObjectQuery 实例的 ToTraceString 方法。另一种方法是查看 Visual Studion 的 IntelliTrace,因为它会记录 SQL 退出您的项目。

于 2012-07-20T11:32:33.753 回答