如何在EF Core 2.0中显示基础SQL查询?

Gig*_*igi 29 c# entity-framework-core

在这个" .NET Core 2.0 Released! "视频结束时的3:15 ,Diego Vega展示了Entity Framework Core 2.0中的新功能演示.作为其中一部分,控制台应用程序中显示了底层SQL的转储.

在此输入图像描述

我在Stack Overflow上看到很多答案,建议人们使用SQL分析器来查看底层查询.但现在我很好奇:你怎么能做Diego Vega所做的事情,并在应用程序中显示查询?

dan*_*era 47

EF 核心 >= 5

简单的日志记录

Entity Framework Core(EF Core)简单日志记录可用于在开发和调试应用程序时轻松获取日志。这种形式的日志记录需要最少的配置,并且不需要额外的 NuGet 包。

LogTo Console

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)

LogTo debug window

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(message => Debug.WriteLine(message));
Run Code Online (Sandbox Code Playgroud)

LogTo file

private readonly StreamWriter _logStream = new StreamWriter("mylog.txt", append: true);

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(_logStream.WriteLine);

public override void Dispose()
{
    base.Dispose();
    _logStream.Dispose();
}

public override async ValueTask DisposeAsync()
{
    await base.DisposeAsync();
    await _logStream.DisposeAsync();
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*mad 36

您好,您可以执行以下操作,在输出窗口中显示Entity Framework Core生成的sql代码.在你的DbContext班上:

public static readonly Microsoft.Extensions.Logging.LoggerFactory _myLoggerFactory = 
new LoggerFactory(new[] { 
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() 
});

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLoggerFactory(_myLoggerFactory);
}
Run Code Online (Sandbox Code Playgroud)

只有在连接调试器时,调试记录器才会在调试输出窗口中写入消息.

您必须执行以下操作:

  • 使用Microsoft.Extensions.Logging;
  • 安装nuget包:Microsoft.Extensions.Logging.Debug

  • 如果您使用 Database First (`Scaffold-DbContext`) 并且您的 `DbContext` 需要重新生成,这将直接覆盖您对 `OnConfiguring` 所做的任何更改,该怎么办? (2认同)

max*_*mus 34

我使用 EF Core 3.x,这对我有用:

services.AddDbContext<LibraryContext>(options => options
    .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole()))
    .UseSqlServer(Configuration.GetConnectionString("LibraryDemoSql")));
Run Code Online (Sandbox Code Playgroud)

信用:https : //stackoverflow.com/a/59663606/2185783

  • 这可能会导致内存泄漏。请参阅[此处](/sf/answers/4772839011/)。 (3认同)
  • 那么在哪里可以看到 SQL 查询呢?我在输出窗口中没有看到它。 (2认同)
  • 嗨@Muflix,这取决于你运行它的位置。我的应用程序是一个 Web API 应用程序,我在 Rider 的 IIS Express 配置中运行它,SQL 日志显示在“运行”窗口中。 (2认同)

Ric*_*SFT 30

只需添加"Microsoft.EntityFrameworkCore.Database.Command": "Information"appsettings.Development.json以便它仅在开发模式下登录。您通常不希望在生产应用程序中记录每个查询。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)

SQL 输出显示在命令窗口或 VS 输出窗口中。

在此处输入图片说明

请参阅官方文档中的 Entity Framework Core 的 SQL 日志记录。这是一个默认情况下不记录的错误,请参阅此 GitHub 问题

  • 这里需要注意的是,在 VS 2022 中,日志记录量的增加将导致调试时性能大幅下降。我建议仅在必要时启用它,除非您正在调试加载旋转器。 (4认同)
  • 对我来说最好的答案。多谢 (2认同)
  • 最后!长期以来一直在寻找这个问题的答案。迄今为止最简单的解决方案。 (2认同)
  • 这只是 EF Core 5 吗? (2认同)

Viv*_*Dev 15

如果您只寻找底层 Sql,那么dani herrera 的答案很棒。

但是从 EF Core 5(我不确定早期版本)开始,有一个名为“调试视图”的功能,我确信您会喜欢它。这并不完全是问题所要求的,但此调试视图有很多您不能忽略的有用信息。

以下是实现这一目标的几种方法。

  1. 在上下文中放置一个断点并查找调试视图,如下所示。

ef core 上下文模型调试视图

我已经展示了短视,现在你尝试一下长视。在这里您可以找到有关上下文所持有的对象的良好信息。

  1. 如果您有 IQueryable,请尝试以下操作。这应该也很有用。请注意,此处的查询尚未发送到数据库。因此,在这里您将获得 EF Core 将要发送到数据库的查询。

ef core IQueryable 调试视图

另请注意,您可以在 IQueryable 对象上调用 ToQueryString() 来获取相同的查询!

queryable.ToQueryString()
Run Code Online (Sandbox Code Playgroud)
  1. 最后但并非最不重要的一点是,尝试在上下文中的更改跟踪器对象上进行调试视图。

Ef Core 上下文上更改跟踪器上的调试视图

该图显示了调用保存更改之前的状态。观察调用保存更改方法发生的情况(按 F10,然后再次观察)。


小智 13

https://docs.microsoft.com/it-it/ef/core/miscellaneous/logging

在OnConfuguring方法中,DbContext您可以设置您的记录器,登录控制台是预定义类型,只需使用此NuGet.请注意,使用Factory模式是记录器实例的最佳实践.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
Run Code Online (Sandbox Code Playgroud)


Cai*_*ard 10

对于使用EF Core 5的用户,您的查询将具有一个Query属性和一个ToQueryString()可以调用以检索查询字符串的方法。请注意,这些属性/方法仅适用于查询,而不适用于结果 - 通常没有临时查询变量,因为它们立即运行,因此最简单的方法是将形成的查询拆分并运行为两个步骤来调试它:

//before
return db.Person.Where(p => p.Name == "John").ToList();

//after; q has Query/ToQueryString()
var q = db.Person.Where(p => p.Name == "John");
return q.ToList();
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

图片由Eamon Keene 的博客提供,其中还详细介绍了如何设置日志记录


rst*_*use 9

我确定接受的答案有效,但我想知道如何使用 DI 做到这一点,所以...

private readonly ILoggerFactory loggerFactory;  

public MyDataContext(DbContextOptions<MyDataContext> options, ILoggerFactory loggerFactory)
        : base(options)
{
    this.loggerFactory = loggerFactory;
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  
{
    // Allow null if you are using an IDesignTimeDbContextFactory
    if (loggerFactory != null)
    { 
        if (Debugger.IsAttached)
        {
            // Probably shouldn't log sql statements in production
            optionsBuilder.UseLoggerFactory(this.loggerFactory); 
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)


N-a*_*ate 7

在 .Net Core 3中的 Visual Studio中记录到输出窗口

使用AddDebug写入到输出调试窗口。

services.AddDbContext<LibraryContext>(options => options
            .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddDebug()))
            .UseSqlServer(Configuration.GetConnectionString("key")));
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 5

如果您正在编写基于 ASP.NET Core MVC 框架的 API 或应用服务,您可以Startup.cs像这样在您的类中启用 SQL 日志记录

public void ConfigureServices(IServiceCollection services)
{
    ...

    Action<DbContextOptionsBuilder> dbOptionsContextBuilder = builder => 
        {
        builder.UseSqlServer(Configuration.DbConnection)  // Configuration.DbConnection is the db connection string
               .UseLoggerFactory(ConsoleLoggerFactory);   // Logs out SQL
        };

    services.AddDbContext<YourDatabaseContext>(dbOptionsContextBuilder);


    ...
}

Run Code Online (Sandbox Code Playgroud)

其中,ConsoleLoggerFactory已确定早期是这样的:

private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });
Run Code Online (Sandbox Code Playgroud)