1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網營銷解決方案
      如何將EFCore生成的SQL語句顯示在控制臺中-創(chuàng)新互聯(lián)

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

      成都創(chuàng)新互聯(lián)公司專注于梅里斯網站建設服務及定制,我們擁有豐富的企業(yè)做網站經驗。 熱誠為您提供梅里斯營銷型網站建設,梅里斯網站制作、梅里斯網頁設計、梅里斯網站官網定制、成都微信小程序服務,打造梅里斯網絡公司原創(chuàng)品牌,更為您提供梅里斯網站排名全網營銷落地服務。

      前言

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

      EF Core性能調優(yōu)

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

      創(chuàng)建一個實例項目


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

        class Program {
          static void Main (string[] args) {
      
            var dbOptionBuilder = new DbContextOptionsBuilder();
            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();
            }
          }
        }

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

        public class MyDbContext : DbContext {
      
          public MyDbContext (DbContextOptions options) : base (options) {
      
          }
      
          public DbSet Users { get; set; }
        }
        public class User
        {
          [Key]
          public Guid UserId { get; set;}
          public string UserName { get; set;}
        }

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

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

      EFLoggerProvider.cs

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

      EFLoggerProvider的代碼非常的簡單,就是直接返回一個我們后續(xù)創(chuàng)建的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 (LogLevel logLevel, 
            EventId eventId,
            TState state, 
            Exception exception, 
            Func formatter) {
              var logContent = formatter (state, exception);
              Console.WriteLine ();
              Console.WriteLine (logContent);
            }
          }
      
          public IDisposable BeginScope (TState state) => null;
        }

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

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

      public class MyDbContext : DbContext {
      
          public MyDbContext (DbContextOptions 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 Users { get; set; }
        }

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

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

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

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

      如何去除無關日志?

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

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

         public void Log (LogLevel logLevel, 
       		EventId eventId, 
       		TState state, 
       		Exception exception, 
       		Func 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 ();
            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語句顯示在控制臺中”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!


      文章名稱:如何將EFCore生成的SQL語句顯示在控制臺中-創(chuàng)新互聯(lián)
      網站網址:http://www.ef60e0e.cn/article/dsdeoi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        吉安市| 永平县| 鹤峰县| 江华| 施秉县| 广宁县| 宁化县| 蒙山县| 土默特右旗| 禄丰县| 盱眙县| 来宾市| 乌审旗| 镇沅| 南召县| 建德市| 根河市| 措勤县| 勐海县| 新龙县| 田东县| 黄骅市| 化州市| 武乡县| 延川县| 石狮市| 商城县| 舞钢市| 伊春市| 安康市| 克拉玛依市| 朝阳市| 巧家县| 红安县| 内黄县| 宁德市| 新竹市| 定远县| 黄陵县| 砚山县| 子长县|