Запросы журнала, выполняемые Entity Framework DbContext
Я использую EF 6.0 с LINQ в проекте MVC 5. Я хочу регистрировать все SQL-запросы, выполняемые Entity Framework DbContext для целей отладки/измерения производительности.
В Java/Hibernate эквивалентное поведение может быть достигнуто установкой свойства hibernate.show_sql=true
. Возможно ли подобное поведение в Entity Framework?
Ответы
Ответ 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