我曾经使用 context.Log 来跟踪 LINQ to SQL 生成的 SQL 语句,如Sql Server Query Visualizer – 看不到生成的 SQL 查询中所示
context.Log = new OutputWindowWriter();
对于 EF,有没有类似上述方法的类似和简单的方法?
我曾经使用 context.Log 来跟踪 LINQ to SQL 生成的 SQL 语句,如Sql Server Query Visualizer – 看不到生成的 SQL 查询中所示
context.Log = new OutputWindowWriter();
对于 EF,有没有类似上述方法的类似和简单的方法?
一般来说,您可以通过简单的方式连接内置跟踪器或任何记录器
context.Database.Log = msg => Trace.WriteLine(msg);
在 DbContext 构造函数中。在MSDN中查看更多信息。MS 的其他一些方法在这里(都基于DataContext.Log属性)。
谈到 Nate 提到的Clutch解决方案,它不适用于 EF v6(请参阅此错误报告)。
参考
Clutch.Diagnostics.EntityFramework(在 NuGet 中可用)非常适合我,而且它比 EFTracingProvider 更简单。
EF 6 的更新:
从 Entity Framework 6 开始,只要 Entity Framework 向数据库发送命令,该命令就可以被应用程序代码拦截。这最常用于记录 SQL,但也可用于修改或中止命令。
具体来说,EF 包括:
* 类似于 LINQ to SQL 中的 DataContext.Log 的上下文的 Log 属性。
* 一种自定义发送到日志的输出内容和格式的机制。
*用于拦截的低级构建块提供更大的控制/灵活性。
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);
});
对此有很多解决方案,但最简单的代码是在 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 是实现此目的的方法)。
扩展 Nate 对 EF6 的回答,NLogCommandInterceptor
在Logging 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。
我相信您可以使用您拥有的 ObjectQuery 实例的 ToTraceString 方法。另一种方法是查看 Visual Studion 的 IntelliTrace,因为它会记录 SQL 退出您的项目。