1. 程式人生 > 實用技巧 >2. EF Core 如何顯示執行的SQL語句

2. EF Core 如何顯示執行的SQL語句

除錯的時候需要檢視執行的SQL 語句,我一般是使用 SQL Profiler,當然還有另外一種方式,就是配置EF 日誌,這兩種方式都比較簡單實用,SQL Profiler可以過濾掉很多自己不想看的日誌,可以只看某一個IP的日誌,而EF Core 的日誌則不可以;

SQL Profiler

TODO 我會在這裡新增一個附件,以後使用記得修改hostname

EF Core 日誌

設定啟動方式

在launchSettings.json中刪除IIS節點,使程式以控制檯應用啟動

在Program.cs 配置日誌

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace CompanyApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging((hostingContext, logging) =>
                {
                    logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                    logging.AddConsole();
                    logging.AddDebug();
                    logging.AddEventSourceLogger();
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

啟用顯示敏感資料

預設是隻能看到引數,看不到引數的值,在startup.cs 的ConfigureServices 方法中啟用顯示敏感資料:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<CompanyDbContext>(options => {
        //啟用顯示敏感資料
        options.EnableSensitiveDataLogging(true);
        options.UseSqlServer(Configuration.GetConnectionString("CompanyDbContext"));
    });
}

配置 appsettings.json 日誌選項

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "CompanyDbContext": "Server=(localdb)\\\\mssqllocaldb;Database=CompanyDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}