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

时间:2017-08-26 08:58:45

标签: c# entity-framework-core

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

enter image description here

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

8 个答案:

答案 0 :(得分:26)

嗨,您可以执行类似以下操作,以在输出窗口中显示Entity Framework Core生成的sql代码。 在您的|类中:

DbContext

仅当连接了调试器时,调试记录器才会在调试输出窗口中写入消息。

您将必须执行以下操作:

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

答案 1 :(得分:20)

只需将 "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": "*"
}

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

enter image description here

请参阅官方文档中的 SQL Logging of Entity Framework Core。这是一个默认情况下不记录的错误,请参阅 this GitHub issue

答案 2 :(得分:19)

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

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

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

答案 3 :(得分:8)

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

DbContext的OnConfiguring方法中,您可以设置记录器,登录控制台是预定义的类型,只需使用this 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");

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:1)

如果您要基于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);


    ...
}

其中ConsoleLoggerFactory的定义如下:

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

答案 6 :(得分:0)

我确定接受的答案有效,但是我想知道如何使用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); 
        }
    }
} 

答案 7 :(得分:0)

此处的许多答案都非常吸引人,但如果您使用的是NLog,则不会。 如果您像我一样使用NLog,则可以执行以下操作:

optionsBuilder.UseLoggerFactory(new NLogLoggerFactory());