Laravel Nova Order By на соответствующий запрос

Мой ответ адресован ядру EF. Я ссылаюсь на эту проблему github , а документы на настройке DbContext :

Простой

Переопределяет метод OnConfiguring вашего DbContext класса (YourCustomDbContext) , как показано здесь , для использования ConsoleLoggerProvider; ваши запросы должны регистрироваться на консоли:

public class YourCustomDbContext : DbContext
{
    #region DefineLoggerFactory
    public static readonly LoggerFactory MyLoggerFactory
        = new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});
    #endregion


    #region RegisterLoggerFactory
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseLoggerFactory(MyLoggerFactory); // Warning: Do not create a new ILoggerFactory instance each time                
    #endregion
}

Complex

Этот сложный случай позволяет избежать переопределения метода DbContext OnConfiguring. , который не рекомендуется в документах: «Этот подход не поддается тестированию, если только тесты не нацелены на полную базу данных».

В этом сложном случае используется:

  • IServiceCollection в методе Startup класса ConfigureServices (вместо переопределения метода OnConfiguring, преимущество - более слабая связь между DbContext и ILoggerProvider, которые вы хотите использовать)
  • Реализация ILoggerProvider (вместо того, чтобы использовать реализацию ConsoleLoggerProvider, показанную выше, преимущество в нашей реализации показывает, как мы будем регистрироваться в File (я не вижу поставщика регистрации файлов , поставляемого с EF Core ))

Как это:

public class Startup

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        var lf = new LoggerFactory();
        lf.AddProvider(new MyLoggerProvider());

        services.AddDbContext(optionsBuilder => optionsBuilder
                .UseSqlServer(connection_string)
                //Using the LoggerFactory 
                .UseLoggerFactory(lf));
        ...
    }
}

Вот реализация MyLoggerProvider (и его MyLogger, который добавляет свои журналы в файл, который вы можете настроить, ваш EF В файле появятся основные запросы.)

public class MyLoggerProvider : ILoggerProvider
{
    public ILogger CreateLogger(string categoryName)
    {
        return new MyLogger();
    }

    public void Dispose()
    { }

    private class MyLogger : ILogger
    {
        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter)
        {
            File.AppendAllText(@"C:\temp\log.txt", formatter(state, exception));
            Console.WriteLine(formatter(state, exception));
        }

        public IDisposable BeginScope(TState state)
        {
            return null;
        }
    } 
}

0
задан Jordan D 29 March 2019 в 09:53
поделиться