Как вы показываете базовый SQL-запрос в EF Core 2.0?

В 3:15 с конца этого выпуска " .NET Core 2.0 выпущено! " Diego Vega демонстрирует демо-версию новых функций в Entity Framework Core 2.0. Как часть этого, дамп базового SQL отображается в консольном приложении.

enter image description here

Я видел много ответов на Stack Overflow, предлагая, чтобы люди использовали профилировщик SQL для просмотра базовых запросов. Но теперь мне любопытно: как вы можете сделать то, что сделал Диего Вега, и получить запрос, чтобы показать там прямо в приложении?

Ответ 1

https://docs.microsoft.com/en-us/ef/core/miscellaneous/logging

В методе OnConfiguring DbContext вы можете установить свой регистратор, вход в консоль - это предопределенный тип, просто используйте этот NuGet. Обратите внимание, что использование фабричного шаблона - лучший способ для экземпляров регистратора.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

Ответ 2

Привет, вы можете сделать что-то вроде следующего, чтобы отобразить созданный sql-код Entity Framework Core в окне вывода. В вашем классе DbContext:

public static readonly Microsoft.Extensions.Logging.LoggerFactory _myLoggerFactory = 
new LoggerFactory(new[] { 
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() 
});

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLoggerFactory(_myLoggerFactory);
}

Журнал отладки записывает сообщения в окно вывода отладки только при подключении отладчика.

Вам нужно будет сделать следующее:

  • используя Microsoft.Extensions.Logging;
  • Установить пакет nuget: Microsoft.Extensions.Logging.Debug

Ответ 3

Я уверен, что принятый ответ работает, но я хотел знать, как это сделать, используя DI, чтобы...

private readonly ILoggerFactory loggerFactory;  

public MyDataContext(DbContextOptions<MyDataContext> options, ILoggerFactory loggerFactory)
        : base(options)
{
    this.loggerFactory = loggerFactory;
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  
{
    // Allow null if you are using an IDesignTimeDbContextFactory
    if (loggerFactory != null)
    { 
        if (Debugger.IsAttached)
        {
            // Probably shouldn't log sql statements in production
            optionsBuilder.UseLoggerFactory(this.loggerFactory); 
        }
    }
} 

Ответ 4

Я следовал инструкциям Мухаммеда и смог захватить базовый SQL.

Хотя это немного не по теме, мне нужна некоторая помощь в отношении сбоя UPDATE (именно поэтому мне нужно было увидеть SQL, сгенерированный EF). У меня есть эта таблица, которая имеет составной ПК (два целых поля). Когда я вызываю обновление в первой записи таблицы (значения PK равны 0 и 1), SQL - это не оператор UPDATE, а INSERT INTO, который не выполняется в ограничении PK. Когда я вызываю update для любой другой записи, все работает нормально: myContext.Update(objectToUpdate); myContext.SaveChanges();

Ответ 5

Если вы пишете API или службу приложений на основе ASP.NET Core MVC, вы можете включить ведение журнала SQL в своем классе Startup.cs, например, так:

public void ConfigureServices(IServiceCollection services)
{
    ...

    Action<DbContextOptionsBuilder> dbOptionsContextBuilder = builder => 
        {
        builder.UseSqlServer(Configuration.DbConnection)  // Configuration.DbConnection is the db connection string
               .UseLoggerFactory(ConsoleLoggerFactory);   // Logs out SQL
        };

    services.AddDbContext<YourDatabaseContext>(dbOptionsContextBuilder);


    ...
}

где ConsoleLoggerFactory был определен ранее примерно так:

private static readonly LoggerFactory ConsoleLoggerFactory = new LoggerFactory(new[] { new ConsoleLoggerProvider((_, __) => true, true) });