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(请参阅此错误报告).
参考
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
该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)
| 归档时间: |
|
| 查看次数: |
24258 次 |
| 最近记录: |