如何针对SQL Server分析实体框架活动?

Kap*_*nir 5 sql-server entity-framework sql-server-profiler

使用SQL Server Profiler跟踪存储过程的活动很容易。但是如何通过实体框架跟踪LINQ发出的SQL查询呢?我需要确定这样的查询(LINQ代码),它们消耗大量时间,被最频繁地调用,因此是进行优化的第一个候选对象。

Eri*_*kEJ 7

将此键添加到您的连接字符串中:

Application Name=EntityFramework
Run Code Online (Sandbox Code Playgroud)

并在 Profiler 中按此过滤


Kap*_*nir 0

我发现了有用的DbContext.Database.Log财产。

\n

MSDN 文章记录和拦截数据库操作

\n

DbContext.Database.Log属性可以设置为任何采用字符串的方法的委托。最常见的是TextWriter通过将其设置为该 TextWriter 的 \xe2\x80\x9cWrite\xe2\x80\x9d 方法来与 any 一起使用。当前上下文生成的所有 SQL 都将记录到该编写器。例如,以下代码会将 SQL 记录到控制台:

\n
using (var context = new BlogContext())\n{\n    context.Database.Log = Console.Write;\n\n    // Your code here...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

记录了什么?

\n

设置 Log 属性后,将记录以下所有内容:

\n
    \n
  • 执行命令所花费的大约时间。请注意,这是从发送命令到返回结果对象的时间。它不包括读取结果的时间。

    \n
  • \n
  • 适用于所有不同类型命令的 SQL。例如:\n查询,包括普通 LINQ 查询、eSQL 查询以及来自 SqlQuery 等方法的原始查询

    \n
  • \n
  • 作为 SaveChanges 的一部分生成的插入、更新和删除

    \n
  • \n
  • 关系加载查询,例如延迟加载生成的查询

    \n
  • \n
  • 参数

    \n
  • \n
  • 命令是否异步执行

    \n
  • \n
  • 指示命令开始执行时间的时间戳

    \n
  • \n
  • 命令是否成功完成、是否因引发异常而失败,或者对于异步是否被取消

    \n
  • \n
  • 结果值的一些指示

    \n
  • \n
\n