标准日志
需要提前引入微软日志包:
PM>Install-Package Microsoft.Extensions.Logging
使用时只需要在配置DbContextOptionsBuilder
时进行配置即可:
ServiceCollection serviceContainer = new ServiceCollection();
serviceContainer.AddDbContext<WPDbContext>(options =>
{
string defaultConnStr = "****"; // 连接字符串
options.UseSqlServer(defaultConnStr);
// 配置标准日志,执行EFCore时会在控制台打印对应的SQL语句
ILoggerFactory myLoggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
options.UseLoggerFactory(myLoggerFactory);
});
在 DBContext 的 OnConfiguring 方法中,也可以对 DbContextOptionsBuilder 进行配置
LogTo
由微软提供的DbContextOptionsBuilder
类的实例方法LogTo
,最简单的用法:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.LogTo(Console.WriteLine);
}
LogTo
接收一个Action<string>
类型的委托,可以自己实现一个兼容Action<string>
委托类型的方法,有很大的灵活性。
通过LogTo,获取的不仅仅是生成的SQL语句,它包含EF内部工作的整个过程,可以自己处理输出内容
ToQueryString
标准日志和 LogTo的方式都是是监听整个DbCotext,如果在一个请求上下文有多个操作时会生成有很多的SQL语句,找起来也是很麻烦的。
ToQueryString
可以针对单个操作获取 SQL 语句(仅限查询操作,因为ToQueryString
是IQueryable
的扩展方法)。
PS:只能获取查询操作,即返回值是
IQueryable
类型的操作
另外,ToQueryString
获取的SQL是不需要真的执行查询的
IQueryable<Book> bookQuery = _dbContext.Books.Where(d => d.Title.Contains("C#"));
Console.WriteLine(bookQuery.ToQueryString());
SQL Server Profiler
属于SQL Server工具,可以跟踪在数据库中执行的所有的SQL。
如果有很多人在操作数据库,你可能来不及找你自己执行的操作。当然 SQL Server Profiler 也提供筛选设置(个人感觉不好用)