Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架如何查看SaveChanges方法的SQL语句_C#_.net_Entity Framework - Fatal编程技术网

C# 实体框架如何查看SaveChanges方法的SQL语句

C# 实体框架如何查看SaveChanges方法的SQL语句,c#,.net,entity-framework,C#,.net,Entity Framework,我曾经使用context.Log来跟踪LINQ到SQL生成的SQL语句,如中所示 对于EF,有没有类似于上述方法的简单方法?我相信您可以使用ObjectQuery实例的ToTraceString方法。 另一种方法是查看Visual Studion的IntelliTrace,因为它记录项目中的SQL。可以输出作为跟踪执行的所有SQL语句。如果需要,还可以使用它添加自己的日志记录。下面是一些可以放在上下文类构造函数中的代码(这是针对DBContext的,但是使用ObjectContext的调整应该非

我曾经使用context.Log来跟踪LINQ到SQL生成的SQL语句,如中所示


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

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

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


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

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

这仅在EF4.1 on中存在(之前在ObjectQuery上调用ToTraceString是实现这一点的方法)。

Clutch.Diagnostics.EntityFramework(在NuGet中提供)非常适合我,并且比EFTracingProvider更简单

EF 6的更新:

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

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


请参见

通常,您可以通过简单的

context.Database.Log = msg => Trace.WriteLine(msg);
在DbContext构造函数中。 更多信息请参阅。MS的其他一些方法是(都基于属性)

谈到Nate提到的解决方案,它不适用于EFV6(请参阅)

参考资料



  • 扩展Nate对EF6的回答,中的
    NLogCommandInterceptor
    仅显示命令文本

    如果有某个特定的参数值导致commandText失败,则不会将这些参数值发送到日志。在我的例子中,我想记录导致外键冲突的值

    这可以通过如下更改NLogCommandInterceptor的
    Logiferor
    方法来改进

    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
        }
    }
    
    private void logiferor(DbCommand命令,DbCommandInterceptionContext-interceptionContext)
    {
    if(interceptOnContext.Exception!=null)
    {
    var commandDumper=新的DbCommandDumper(命令);
    警告(命令失败:\r\n{0},commandDumper.GetLogDump());
    //异常将被进一步记录到堆栈中
    }
    }
    

    类将DbCommand重建为TSQL,可以将其重放到测试数据库中。

    我使用的是Visual Studio 2010 Express-IntelliTrace不存在,我认为Judo:您的解决方案只显示选择。Jonathan Rupp的回答显示了所有内容(插入、更新).哇,是的,那太容易了。而且,对你的源代码的其余部分也不需要任何更改,这很好。好的发现!好吧,也许我很笨,但是如何使用离合器诊断?我尝试了来自的建议,但对我来说不起作用:(更多信息在中。离合器似乎与EF 6不起作用。有关寻求“现代”的人,请参见(2017+/asp.net核心版)做事方式:fiat的这条评论正是你想要的。附录:对于那些想深入阅读本文的人,我有一个问题,更新引发异常,并且它试图执行的sql没有进入日志。对于一个涉及Entity Framework 4.0的问题,这怎么可能是公认的答案,而且都提到了她e仅适用于EF 6?EF核心解决方案:
    context.Database.Log = msg => Trace.WriteLine(msg);
    
    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
        }
    }