在开发中,使用 ef core 框架,在使用 linq 或则 Lambda 表达式的时候,无法直接查看 sql 语句,不方便我们排查或者优化性能,如何查看 ef core 生成的 sql 语句呢?
本文以 ef core 5 为例,查看输出 ef 生成的 sql 语句。
首先,在 startup 文件新建一个 consolelogger 工厂变量为“ConsoleLoggerFactory”,生成的 sql 语句将输出到控制台,代码如下:
在 ConfigureServices 方法配置 DbContext 添加日志输出,代码如下:
启动项目,查看控制台输出,如下:
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT [a].[Id], [a].[Disabled], [a].[Link], [a].[Name], [a].[PinYin], [a].[Position], [a].[_CreateTime], [a].[_CreateTimeStamp], [a].[_UpdateTime], [a].[_UpdateTimeStamp]
FROM [Area] AS [a]
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (19ms) [Parameters=[p0='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SELECT * FROM Area WHERE pinYin = @p0
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT * FROM Area
如果带有 where 条件的 sql 语句,只能查看参数化的变量,无法查看具体传入的值,增加如下配置:
使应用程序数据能够包含在异常消息、日志等中。
这可以包括分配给实体实例属性的值,
发送到数据库的命令的参数值,以及其他此类数据。
只有在有适当的安全措施时才应启用此标志
基于这些数据的敏感性。
请注意,如果应用程序正在通过
打电话给Microsoft.EntityFrameworkCore.DbContextOptions生成器.UseInternalServiceProvider(系统.IServiceProvider),
然后,对于该服务提供者的所有使用,必须以相同的方式配置此选项。
考虑不打电话Microsoft.EntityFrameworkCore.DbContextOptions生成器.UseInternalServiceProvider(系统.IServiceProvider)
因此EF将管理服务提供者,并可以根据需要创建新实例
完整设置如下:
效果图如下:
当然,以上设置也可以通过重写 DbContext 的 OnConfiguring 方法进行配置(不推荐):
(完)
|