0

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

4

1 回答 1

2

我不认为你可以让 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.
}

一些评论

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

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

于 2017-01-01T22:04:16.890 回答