由Entity Framework DbContext执行的日志查询

时间:2014-05-22 10:52:55

标签: c# linq entity-framework asp.net-mvc-5 entity-framework-6

我在MVC 5项目中使用EF 6.0和LINQ。我想记录Entity Framework DbContext执行的所有SQL查询,以进行调试/性能测量。

在Java / Hibernate中,可以通过设置属性hibernate.show_sql=true来实现等效行为。是否有可能在实体框架中有类似的行为?

6 个答案:

答案 0 :(得分:52)

Logging and Intercepting Database Operations MSDN上的文章正是您所寻找的。

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+,有一个简单的方法。查看以下链接了解更多详情。

https://docs.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>

答案 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)

实体框架核心3

来自How to Implement Property Change Notification

创建工厂并设置过滤器。

OnPropertyChanged();

通过OnConfiguring方法告诉DbContext使用工厂:

public string Name
{
    get { return name; }
    set
    {
        name = value;
        OnPropertyChanged();
    }
}