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