记录实体框架DbContext执行的查询
本文关键字:查询 执行 DbContext 实体 框架 记录 | 更新日期: 2023-09-27 18:04:32
我在MVC 5项目中使用EF 6.0与LINQ。我想记录所有由实体框架DbContext执行的SQL查询,用于调试/性能测量目的。
在Java/Hibernate中,可以通过设置属性hibernate.show_sql=true
来实现等效行为。是否有可能在实体框架中有类似的行为?
记录和拦截数据库操作的文章在MSDN是什么你正在寻找。
DbContext.Database.Log
属性可以设置为任何接受字符串的方法的委托。最常见的是,它被用于任何TextWriter
设置为"写"的方法,该textwwriter。当前上下文生成的所有SQL都将记录到该写入器。例如,以下代码将把SQL记录到控制台:
using (var context = new BlogContext())
{
context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
// Your code here...
}
UPDATE 2022:日志记录现在在ef core的开发中默认启用。该行为可以在DB上下文的构建器中配置(启用敏感数据日志记录以记录查询参数值或指定要记录的事件):
services.AddDbContext<IDbContext, ApplicationDbContext>(
options => options.UseSqlServer(dbConnectionString)
.LogTo(s => System.Diagnostics.Debug.WriteLine(s))
.EnableDetailedErrors(isDebugMode)
.EnableSensitiveDataLogging(isDebugMode));
或者您可以使用app.settings文件为您感兴趣的事件定义日志配置
您可以使用这一行将SQL查询记录到Visual Studio "Output"窗口,而不是控制台窗口,同样仅在调试模式下。
public class YourContext : DbContext
{
public YourContext()
{
Database.Log = sql => Debug.Write(sql);
}
}
如果你有一个带有日志记录器的。net Core设置,那么EF将把它的查询记录到你想要的任何输出:调试输出窗口、控制台、文件等。
你只需要在你的应用设置中配置"信息"日志级别。例如,这有EF记录到调试输出窗口:
"Logging": {
"PathFormat": "Logs/log-{Date}.txt",
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Information",
"System": "Information",
"Microsoft": "Information"
}
},
"Console": {
"LogLevel": {
"Default": "Information",
"System": "Warning",
"Microsoft": "Warning"
}
},
"File": {
"LogLevel": {
"Default": "Information",
"System": "Warning",
"Microsoft": "Warning"
}
},
"LogLevel": {
"Default": "Information",
"System": "Warning",
"Microsoft": "Warning"
}
}
EF Core日志自动集成了。net Core的日志机制。示例如何使用它记录到控制台:
public class SchoolContext : DbContext
{
//static LoggerFactory object
public static readonly ILoggerFactory loggerFactory = new LoggerFactory(new[] {
new ConsoleLoggerProvider((_, __) => true, true)
});
//or
// public static readonly ILoggerFactory loggerFactory = new LoggerFactory().AddConsole((_,___) => true);
public SchoolContext():base()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLoggerFactory(loggerFactory) //tie-up DbContext with LoggerFactory object
.EnableSensitiveDataLogging()
.UseSqlServer(@"Server=.'SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;");
}
public DbSet<Student> Students { get; set; }
}
如果您想记录到输出窗口,请使用以下命令:
public static readonly ILoggerFactory loggerFactory = new LoggerFactory(new[] {
new DebugLoggerProvider()
});
https://www.entityframeworktutorial.net/efcore/logging-in-entityframework-core.aspx 如果有人使用EF6.1+有一个简单的方法。查看以下链接了解更多详细信息。
https://learn.microsoft.com/en-us/ef/ef6/fundamentals/configuring/config-file interceptors-ef61-onwards
示例代码<interceptors>
<interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
<parameters>
<parameter value="C:'Stuff'LogOutput.txt"/>
<parameter value="true" type="System.Boolean"/>
</parameters>
</interceptor>
</interceptors>
Entity Framework Core 5及以上版本
在YourDbContext
中使用额外的行重写OnConfiguring
方法:
public class YourContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.LogTo(Console.WriteLine);
}
}
实体框架核心3
选自本文
创建工厂并设置过滤器
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddConsole((options) => { })
.AddFilter((category, level) =>
category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information);
});
告诉DbContext在onconfiguration方法中使用工厂:
optionsBuilder.UseLoggerFactory(_loggerFactory);