.net core实用技巧——将EF Core生成的SQL语句显示在控制台中
副问题[/!--empirenews.page--]
假如你的项目中行使了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; } } 下面我们启动项目,看一下结果。这里日记信息正确的表现出来了。 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(); } } } 从头运行措施,你会获得一下功效。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |