【问题标题】:How to profile Entity Framework activity against SQL Server?如何针对 SQL Server 分析实体框架活动?
【发布时间】:2017-04-14 03:47:16
【问题描述】:

使用 SQL Server Profiler 跟踪存储过程活动很容易。但是如何通过实体框架跟踪 LINQ 发出的 SQL 查询呢?我需要确定此类查询(LINQ 代码)消耗大量时间,调用最频繁,因此是优化的首选候选者。

【问题讨论】:

  • 您绝对仍然可以使用 SQL Server Profiler 查看最终后端发生的情况,或者查看 Entity Framework Profiler 直接检查 EF 代码

标签: sql-server entity-framework sql-server-profiler


【解决方案1】:

将此密钥添加到您的连接字符串:

Application Name=EntityFramework

并在 Profiler 中按此过滤

【讨论】:

  • 谢谢。Profiler 会识别出消耗大部分调用/时间的具体 LINQ 语句/查询吗?实体框架是在此应用程序中访问 SQL Server 的唯一方式。也就是说 - 有没有办法将 Profiler 中的行映射到应用程序代码中的 LINQ 行?
  • Profiler 记录时间/资源消耗,是的,您可以使用 Database.Log(需要更改配置/代码)来登录代码...
  • 不幸的是,我们的项目使用了 ObjectContext - 可能您提到了 Database.Log 属性并设置此属性以将 DbContext 生成的 SQL 记录到给定的委托?
【解决方案2】:

添加@ErikEJ 的答案:如果您使用的是 .net Core,那么您使用的是 EFCore。没有 Database.Log 属性。您应该使用 OnConfiguring 覆盖您的 DbContext 类,然后

optionsBuilder.LogTo(Console.WriteLine);

示例:

public class AppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }       

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.LogTo(Console.WriteLine);
    }
}

【讨论】:

    【解决方案3】:

    我发现了有用的 DbContext.Database.Log 属性。

    MSDN 文章Logging and Intercepting Database Operations

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

    using (var context = new BlogContext())
    {
        context.Database.Log = Console.Write;
    
        // Your code here...
    }
    

    记录了什么?

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

    • 执行命令所需的大致时间。请注意,这是从发送命令到取回结果对象的时间。它不包括阅读结果的时间。

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

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

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

    • 参数

    • 命令是否异步执行

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

    • 命令是否成功完成,是否因抛出异常而失败,或者对于异步,是否被取消

    • 结果值的一些指示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多