.net core实用技巧——将EF Core生成的SQL语句显示在控制台中_实用技巧

来源:脚本之家  责任编辑:小易  

NET Core 使用Dapper 操作2113MySQL 数据库, .NET Core 使用Dapper。目前官方5261没有出.NET Core MySQL 驱动,但是已经有第4102三方进行改动封装出.NET Core MySQL Connector 预览版。Dapper 也已1653经出了 .NET Core 预览版。Dapper dot net 是一个轻量型的ORM,但是性能很强大。有了.NET Core MySQL Connector 我们可以直接使用ADO.NET 操作数据库。目前EF Core 暂时不支持MySQL, 本篇主要讲解使用Dapper 操作 MySQL。第三方 MySQL Connector: Dapper: 新建项目新建一个.NET Core控制台应用程序 NETCoreMySQL,1、MSSQL,也就是常说的 Microsoft SQL Server。对于2113 非 Windows 的系统来说,是不能安5261装使用的——至少在没4102出 Linux 版之前,但听说微软打1653算出品 For linux,只不过功能要低一些。2、MySQL / Maridb,这是各个公司最常用的数据库。为什么,免费呗,不花银子呗。不花钱的谁不喜欢。而他最佳拍档就是 PHP 啦。听说 php 7.0 用得是 PDO 链接数据库的方法,这就对数据库操作提供了更好的方式。3、Sqlite,你可以把他当成像 Access 那样就是一个文件的数据库,也可以理解为在 Access 基础上,一个全面的独立 SQL 数据库文件4、Oracle,甲骨文的最好的技术产物——自从 Java 被收了后,感觉 Java 就被 oracle 好好绑架当压寨夫人了,而小弟弟 mysql 成了小催。。。呃。。。过了过了。Oracle 强大的数据库管控能力是在 SQL 之上,所以被称为大神级的数据库www.zgxue.com防采集请勿采集本网。

前言

笔者最近在开发和维护一个.NET Core项目,其中使用几个非常有意思的.NET Core相关的扩展,在此总结整理一下。

个vfhdjjgh

EF Core性能调优

用电脑的一些实用的小技巧: 1、如果同时有多个窗口打开,想要关闭的话,可以按住shift不放然后点击窗口右上角的关闭图标。2、在保存网页前,可以按一下"ESC"键(或脱机工作)再保存,这样保存很快3、用电脑听CD可以不用任何的播放软件,把音箱线直

如果你的项目中使用了EF Core, 且正在处于性能调优阶段,那么了解EF Core生成的SQL语句是非常关键的。那么除了使用第三方工具,如何查看EF Core生成的SQL语句呢?这里笔者将给出一个基于.NET Core内置日志组件的实现方式。

把 "=" 换成 "in“ 试一下,你现在数据库用sql语句试一下能否查出来,然后再转成hql语句试下;

创建一个实例项目

我推荐使用log4jdbc或是log4jdbc-remix,其实这2个都差不多,这个会把你sql的的?以实际的值填充进去,对查看生成的sql非常有帮助

我们首先建一个控制台程序,在主程序中我们编写了一个最简单的EF查询。

DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit 文本编辑 mem 查看内存状况 md 建立子目录 move 移动文件、改目录名 more 分屏显示 type 显

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(); } } }

重新运行程序,你会得到一下结果。

这里你可能会问为什么不显示@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参数的值了。

以上就是.net core实用技巧——将EF Core生成的SQL语句显示在控制台中的详细内容,更多关于.net core实用技巧的资料请关注真格学网其它相关文章! 您可能感兴趣的文章:.net EF Core专题:EF Core 读取数据时发生了什么?.net core EF Core调用存储过程的方式详解.Net Core 权限验证与授权(AuthorizeFilter、ActionFilterAttribute).NET Core类库System.Reflection.DispatchProxy实现简易Aop的方法在.NET Core类库中使用EF Core迁移数据库到SQL Server的方法CodeFirst从零开始搭建Asp.Net Core2.0网站.Net Core中使用ref和Span<T>提高程序性能的实现代码

以前.Net开发人员只需要选定运2113行时和.Net框架即可。但5261现在,它是Windows生态系统从4102物联网到云最宽泛的1653一部分。开发人员有选择,这在Microsoft的VisualStudio2017的新安装程序中显而易见。当涉及到编写C#,F#或VisualBasic,有广泛的.Net变体和平台可以选择。这不是一件坏事,.Net跨平台运行时本来就是微软的最初目标之一,虽然当时未能如愿,因为微软没有击败Flash。有趣的是,VisualStudio安装程序对新家庭成员.NetCore十分重视。当选择构建ASP.NetWeb应用程序或想使用容器跨平台应用程序时,.NetCore是将熟悉的Windows开发工具应用到更广泛的Microsoft生态系统,特别是下一代企业应用程序的构建。虽然.NetCore具有许多其他.Net平台的部分功能,但它专注于提供基于控制台的服务器应用程序。它在Windows,MacOS和Linux上提供构建和运行命令行应用程序的工具,它也是用于构建ASP.NetCoreWeb应用程序的工具。在WindowsServerNano上运行.NetCore,使用熟悉的工具在Windows容器中构建和运行微服务内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • asp.net通过remoting service上传文件
  • asp.net 生成静态页笔记
  • asp.net实现301重定向方法
  • asp.net core 1.0实现邮件发送功能
  • 基于.net standard 的动态编译实现代码
  • .net连接池的问题详解
  • asp.net 用户在线退出更新实现代码
  • asp.net实现导出datatable数据到word或者excel的方法
  • asp.net mvc5网站开发之添加\删除\重置密码\修改密码\列表浏览管
  • asp.net core简单介绍教程(1)
  • 如何在.net core中使用ef
  • net core 怎么操作数据库
  • jdbc执行sql语句怎么实现在console控制台中显示执...
  • hibernate怎么在控制台显示sql语句
  • websphere中persistence.xml如何配置使sql语句显示...
  • 用电脑的一些实用的小技巧
  • hql语句执行之后在控制台得到SQL语句,将sql语句放...
  • 如何在mybatis中调试查看生成的sql语句
  • 最基础,最常用的DOS命令大全(不要长篇大论)
  • 98常用DOS命令
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net.net ef core专题:ef core 读取数据时发生了什么?.net core ef core调用存储过程的方式详解.net core 权限验证与授权(authorizefilter、actionfilterattribute).net core类库system.reflection.dispatchproxy实现简易aop的方法在.net core类库中使用ef core迁移数据库到sql server的方法codefirst从零开始搭建asp.net core2.0网站.net core中使用ref和span<t>提高程序性能的实现代码asp.net通过remoting service上传文件asp.net 生成静态页笔记asp.net实现301重定向方法asp.net core 1.0实现邮件发送功能基于.net standard 的动态编译实现代码.net连接池的问题详解asp.net 用户在线退出更新实现代码asp.net实现导出datatable数据到word或者excel的方法asp.net mvc5网站开发之添加\删除\重置密码\修改密码\列表浏览管asp.net core简单介绍教程(1)java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字asp.net cache的一些总结分享asp.net使用dataset的readxml读取xml文件.net core 3.0 可回收程序集加载上下文的.net笔记:system.io之windows文件操作的深c#处理json的另外一种方式成功实践基于.net standard 的动态编译实现代码用asp.net还原与恢复sql server大型门户网站实现的十四大技术小结一句话轻松搞定asp.net分页c# 生成高质量缩略图程序—终极算法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved