我在MVC 5项目中使用EF 6.0和LINQ。我想记录Entity Framework DbContext执行的所有SQL查询,以进行调试/性能测量。
在Java / Hibernate中,可以通过设置属性hibernate.show_sql=true
来实现等效行为。是否有可能在实体框架中有类似的行为?
答案 0 :(得分:52)
DbContext.Database.Log
属性可以设置为任何带字符串的方法的委托。最常见的是,它通过将其设置为TextWriter的“Write”方法与任何TextWriter
一起使用。当前上下文生成的所有SQL都将记录到该编写器。例如,以下代码将SQL记录到控制台:
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
// Your code here...
}
答案 1 :(得分:25)
您可以使用此行仅记录"输出"窗口,而不是控制台窗口,再次只在调试模式下。
public class YourContext : DbContext
{
public YourContext()
{
Database.Log = sql => Debug.Write(sql);
}
}
答案 2 :(得分:1)
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
答案 3 :(得分:1)
如果有人使用 EF6.1+,有一个简单的方法。查看以下链接了解更多详情。
示例代码
<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>
答案 4 :(得分:0)
如果您使用记录器设置了.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"
}
}
答案 5 :(得分:0)
来自How to Implement Property Change Notification
创建工厂并设置过滤器。
OnPropertyChanged();
通过OnConfiguring方法告诉DbContext使用工厂:
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged();
}
}