如何针对 SQL 服务器分析 Entity Framework activity?
How to profile Entity Framework activity against SQL Server?
使用 SQL Server Profiler 跟踪存储过程 activity 很容易。但是如何通过 Entity Framework 跟踪 LINQ 发出的 SQL 查询?我需要确定这样的查询(LINQ 代码),这些查询消耗大量时间,调用频率最高,因此是最先进行优化的候选对象。
将此密钥添加到您的连接字符串:
Application Name=EntityFramework
并在 Profiler 中按此过滤
我发现有用 DbContext.Database.Log
属性.
MSDN 文章Logging and Intercepting Database Operations
DbContext.Database.Log
属性 可以设置为任何接受字符串的方法的委托。最常见的是它与任何 TextWriter
一起使用,方法是将其设置为该 TextWriter 的“Write”方法。当前上下文生成的所有 SQL 都将记录到该编写器。例如,以下代码会将 SQL 记录到控制台:
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
// Your code here...
}
记录了什么?
设置日志 属性 后,将记录以下所有内容:
执行命令所花费的大概时间。请注意,这是从发送命令到取回结果对象的时间。它不包括阅读结果的时间。
SQL 适用于所有不同类型的命令。例如:
查询,包括普通 LINQ 查询、eSQL 查询和来自 SqlQuery
等方法的原始查询
作为 SaveChanges 的一部分生成的插入、更新和删除
关系加载查询,例如延迟加载生成的查询
参数
命令是否异步执行
指示命令开始执行时间的时间戳
命令是否成功完成、因抛出异常而失败,或者对于异步,是否被取消
结果值的一些指示
添加@ErikEJ 的回答:如果您正在使用 .net Core,那么您正在使用 EFCore。没有Database.Log属性。您应该使用 OnConfiguring 覆盖您的 DbContext class 然后
optionsBuilder.LogTo(Console.WriteLine);
样本:
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.LogTo(Console.WriteLine);
}
}
使用 SQL Server Profiler 跟踪存储过程 activity 很容易。但是如何通过 Entity Framework 跟踪 LINQ 发出的 SQL 查询?我需要确定这样的查询(LINQ 代码),这些查询消耗大量时间,调用频率最高,因此是最先进行优化的候选对象。
将此密钥添加到您的连接字符串:
Application Name=EntityFramework
并在 Profiler 中按此过滤
我发现有用 DbContext.Database.Log
属性.
MSDN 文章Logging and Intercepting Database Operations
DbContext.Database.Log
属性 可以设置为任何接受字符串的方法的委托。最常见的是它与任何 TextWriter
一起使用,方法是将其设置为该 TextWriter 的“Write”方法。当前上下文生成的所有 SQL 都将记录到该编写器。例如,以下代码会将 SQL 记录到控制台:
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
// Your code here...
}
记录了什么?
设置日志 属性 后,将记录以下所有内容:
执行命令所花费的大概时间。请注意,这是从发送命令到取回结果对象的时间。它不包括阅读结果的时间。
SQL 适用于所有不同类型的命令。例如: 查询,包括普通 LINQ 查询、eSQL 查询和来自 SqlQuery
等方法的原始查询作为 SaveChanges 的一部分生成的插入、更新和删除
关系加载查询,例如延迟加载生成的查询
参数
命令是否异步执行
指示命令开始执行时间的时间戳
命令是否成功完成、因抛出异常而失败,或者对于异步,是否被取消
结果值的一些指示
添加@ErikEJ 的回答:如果您正在使用 .net Core,那么您正在使用 EFCore。没有Database.Log属性。您应该使用 OnConfiguring 覆盖您的 DbContext class 然后
optionsBuilder.LogTo(Console.WriteLine);
样本:
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.LogTo(Console.WriteLine);
}
}