Подтвердить что ты не робот

Запросы журнала, выполняемые Entity Framework DbContext

Я использую EF 6.0 с LINQ в проекте MVC 5. Я хочу регистрировать все SQL-запросы, выполняемые Entity Framework DbContext для целей отладки/измерения производительности.

В Java/Hibernate эквивалентное поведение может быть достигнуто установкой свойства hibernate.show_sql=true. Возможно ли подобное поведение в Entity Framework?

4b9b3361

Ответ 1

Запись и перехват операций с базами данных в MSDN - это то, что вы ищете.

Свойство DbContext.Database.Log может быть установлено делегатом для любого метода, который принимает строку. Чаще всего он используется с любым TextWriter, устанавливая его в метод "Write" этого TextWriter. Все SQL, сгенерированные текущим контекстом, будут записываться в этот файл. Например, следующий код будет записывать SQL на консоль:

using (var context = new BlogContext())
{
    context.Database.Log = Console.Write;

    // Your code here...
}

Ответ 2

Вы можете использовать эту строку для регистрации только в окне "Выход", а не в окне консоли, снова в режиме отладки.

public class YourContext : DbContext
{   
    public YourContext()
    {
        Database.Log = sql => Debug.Write(sql);
    }
}

Ответ 3

Если у вас есть установка .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"
  }
}

Ответ 4

Ведение журнала 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