【问题标题】:Find out which code run Entity Framework sql code找出运行实体框架 sql 代码的代码
【发布时间】:2017-01-02 06:04:16
【问题描述】:

我已经开始使用一些实体框架分析器,例如 ANTS 和一些其他类似的替代品。 Profiler 分析后,它以 Entity Framework 生成的 SQL 查询格式列出了所有 Entity Framework 瓶颈。但我无法跟踪代码中的哪个查询。是否有可能知道哪一行代码运行了那个 SQL 查询?

【问题讨论】:

  • 您可以在代码中记录所有 Linq (SQL GENERATED) 查询。通过将它们记录在文件中

标签: asp.net-mvc entity-framework profiler ants


【解决方案1】:

我认为你不能让 ANTS 做到这一点(只有 Redgate 可以)。

但无论是否进行分析,您始终可以通过将日志记录 Action 附加到上下文的 Database.Log 属性来记录所有 SQL 语句。

在这个记录动作中,你也可以记录当时的堆栈跟踪,然后尝试在调试记录中找到报告的 SQL 瓶颈:

using (var db = new MyContext())
{
    db.Database.Log = s =>
    {
        Debug.WriteLine(s);
        if (s.StartsWith("SELECT"))
            Debug.WriteLine("\nStack trace:\n" +
                string.Join("", new StackTrace(3).GetFrames().ToList()));
    };
    // LINQ statements here.
}

一些cmets

  • 我使用new StackTrace(3) 跳过覆盖记录过程本身的前几帧。在堆栈跟踪的某处,您会发现触发记录的 SQL 语句的 C# 方法。
  • 这只会记录SELECT 命令的堆栈跟踪。通常,您要分析的就是这些。

从上下文工厂获取上下文实例是个好主意,这样您就可以只编写一次此日志记录代码。您可能希望通过 if DEBUG 编译器指令有条件地添加日志记录操作。

【讨论】:

  • 应该被接受为答案。顺便说一句,我使用StackTrace的构造函数为new StackTrace(3, true),根据this question查看日志中的文件信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多