中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何將EF Core生成的SQL語句顯示在控制臺中

發布時間:2021-03-04 16:27:08 來源:億速云 閱讀:273 作者:TREX 欄目:開發技術

本篇內容主要講解“如何將EF Core生成的SQL語句顯示在控制臺中”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何將EF Core生成的SQL語句顯示在控制臺中”吧!

前言

筆者最近在開發和維護一個.NET Core項目,其中使用幾個非常有意思的.NET Core相關的擴展,在此總結整理一下。

EF Core性能調優

如果你的項目中使用了EF Core, 且正在處于性能調優階段,那么了解EF Core生成的SQL語句是非常關鍵的。那么除了使用第三方工具,如何查看EF Core生成的SQL語句呢?這里筆者將給出一個基于.NET Core內置日志組件的實現方式。

創建一個實例項目

我們首先建一個控制臺程序,在主程序中我們編寫了一個最簡單的EF查詢。

  class Program {
    static void Main (string[] args) {

      var dbOptionBuilder = new DbContextOptionsBuilder<MyDbContext>();
      dbOptionBuilder
       .UseMySql("server=localhost;port=3306;database=EFCoreSampleDB;userid=root;pwd=a@12345");

      using (var dbContext = new MyDbContext(dbOptionBuilder.Options)) {
        var query = dbContext.Users.ToList();
      }
    }
  }

這里為了演示,我們提前創建了一個MySql數據庫,并在項目中創建了一個對應的EF Core上下文。當前上下文中只有一個User實體,該實體只有2個屬性UserId和UserName。

  public class MyDbContext : DbContext {

    public MyDbContext (DbContextOptions<MyDbContext> options) : base (options) {

    }

    public DbSet<User> Users { get; set; }
  }
  public class User
  {
    [Key]
    public Guid UserId { get; set;}
    public string UserName { get; set;}
  }

如何生成的SQL語句輸出到控制臺?

.NET Core中提供了非常完善的日志接口。這里為了和.NET Core的日志接口集成,我們需要實現2個接口,一個是日志提供器接口ILoggerProvider, 一個是日志接口ILogger

EFLoggerProvider.cs

  public class EFLoggerProvider : ILoggerProvider {
    public ILogger CreateLogger (string categoryName) => new EFLogger (categoryName);
    public void Dispose () { }
  }

EFLoggerProvider的代碼非常的簡單,就是直接返回一個我們后續創建的EFLogger對象。

EFLogger.cs

	public class EFLogger : ILogger {
    private readonly string categoryName;

    public EFLogger (string categoryName) => this.categoryName = categoryName;

    public bool IsEnabled (LogLevel logLevel) => true;

    public void Log<TState> (LogLevel logLevel, 
      EventId eventId,
      TState state, 
      Exception exception, 
      Func<TState, Exception, string> formatter) {
        var logContent = formatter (state, exception);
        Console.WriteLine ();
        Console.WriteLine (logContent);
      }
    }

    public IDisposable BeginScope<TState> (TState state) => null;
  }

這里我們主要使用了內置的formatter格式化了日志信息。

最后我們還需要將自定義的日志處理類和EF Core集成起來。這里我們需要復寫上下文類的OnConfiguring方法。在其中通過UseLoggerFactory方法,將我們自定義的日志處理類和EF Core的日志系統關聯起來。

	public class MyDbContext : DbContext {

    public MyDbContext (DbContextOptions<MyDbContext> options) : base (options) {

    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

      var loggerFactory = new LoggerFactory ();
      loggerFactory.AddProvider(new EFLoggerProvider());
      optionsBuilder.UseLoggerFactory(loggerFactory);

      base.OnConfiguring(optionsBuilder);
    }

    public DbSet<User> Users { get; set; }
  }

下面我們啟動項目,看一下效果。這里日志信息正確的顯示出來了。

如何將EF Core生成的SQL語句顯示在控制臺中

PS: 如果項目中使用了通用主機或者ASP.NET Core, 你也可以在服務配置部分,通過DbContextOptions參數配置。

services.AddDbContext<MyDbContext>(options =>
       options.UseSqlServer(Configuration.GetConnectionString("MyDb"))
          .UseLoggerFactory(new LoggerFactory()));

如何去除無關日志?

在前面的步驟中,我們成功的輸出了查詢語句,但是有一個問題是我們只想查看輸出的SQL語句,其他的信息我們都不想要,那么能不能去除掉這些無關日志呢?答案是肯定的。

我們可以在Log方法中,通過分類名稱,只輸出Microsoft.EntityFrameworkCore.Database.Command分類下的日志,該日志即生成的SQL語句部分。

   public void Log<TState> (LogLevel logLevel, 
 		EventId eventId, 
 		TState state, 
 		Exception exception, 
 		Func<TState, Exception, string> formatter)
  {

    if (categoryName == DbLoggerCategory.Database.Command.Name &&
      logLevel == LogLevel.Information) {
      var logContent = formatter (state, exception);

      Console.WriteLine ();
      Console.ForegroundColor = ConsoleColor.Green;
      Console.WriteLine (logContent);
      Console.ResetColor ();
    }
  }

這里我們也做了一些其他的操作,通過修改控制臺輸出文本的顏色,高亮了生成的SQL語句。重新啟動項目之后,效果如下。

如何顯示敏感數據?

這里看似我們已經完成了EF Core的語句輸出,但是在實際使用中,你還會遇到另外一個問題。

下面我們修改一下我們的主程序,我們嘗試插入一條User信息。

  class Program {
    static void Main (string[] args) {

      var dbOptionBuilder = new DbContextOptionsBuilder<MyDbContext> ();
      dbOptionBuilder.UseMySql ("server=localhost;port=3306;database=EFCoreSampleDB;userid=root;pwd=a@12345");

      using (var dbContext = new MyDbContext (dbOptionBuilder.Options)) {
        dbContext.Users.Add(new User { UserId = Guid.NewGuid(), UserName = "Lamond Lu"});
        dbContext.SaveChanges();
      }
    }
  }

重新運行程序,你會得到一下結果。

如何將EF Core生成的SQL語句顯示在控制臺中

這里你可能會問為什么不顯示@p0, @p1參數的值。這里是原因是為了保護敏感數據,EF Core默認關閉的敏感數據的顯示配置,如果你想要查看敏感數據,你需要通過DbContextOptionsBuilder對象的EnableSensitiveDataLogging方法修改敏感數據日志配置。

  protected override void OnConfiguring (DbContextOptionsBuilder optionsBuilder) {
    var loggerFactory = new LoggerFactory ();
    loggerFactory.AddProvider (new EFLoggerProvider ());
    optionsBuilder.EnableSensitiveDataLogging (true);
    optionsBuilder.UseLoggerFactory (loggerFactory);

    base.OnConfiguring (optionsBuilder);
  }

重新啟動項目之后,你就能看到@p0, @p1參數的值了。

如何將EF Core生成的SQL語句顯示在控制臺中


到此,相信大家對“如何將EF Core生成的SQL語句顯示在控制臺中”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

小金县| 盐池县| 台中市| 新源县| 威信县| 凤凰县| 太仓市| 墨脱县| 长岭县| 鄂伦春自治旗| 镇原县| 南阳市| 日喀则市| 苏尼特右旗| 茂名市| 卢龙县| 新巴尔虎右旗| 象州县| 五峰| 娱乐| 玉屏| 淳化县| 云南省| 益阳市| 遂昌县| 太仆寺旗| 禄劝| 贺州市| 建宁县| 麻阳| 开平市| 政和县| 乌什县| 册亨县| 胶州市| 志丹县| 静乐县| 雷波县| 开鲁县| 普宁市| 泾源县|