Как мне подключить пользовательское ведение журнала к моим миграциям ef6? - PullRequest
1 голос
/ 06 марта 2020

У меня есть DbMigrationsConfiguration, которая выглядит следующим образом:

    internal sealed class Configuration : DbMigrationsConfiguration<DatabaseProject.DB>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            AutomaticMigrationDataLossAllowed = false;
        }
    }

В другом месте, в моем классе DbContext у меня есть:

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<DB, DbProject.Migrations.Configuration>(useSuppliedContext: true));
            // and so on...

И я хочу использовать MigrationsLogger для записи некоторой информации когда миграция применяется. Поэтому я настроил простой класс, как этот, используя serilog:

    public class EfLogger : MigrationsLogger
    {
        public override void Info(string message)
        {
            Log.Logger.Information("Machine {name} reported EF Migration Message: {message}", Environment.MachineName,
                message);
        }

        public override void Warning(string message)
        {
            Log.Logger.Warning("Machine {name} reported EF Migration Warning: {message}", Environment.MachineName,
                message);
        }

        public override void Verbose(string message)
        {
            Log.Logger.Verbose("Machine {name} reported EF Migration verbose message: {message}", Environment.MachineName,
                message);
        }
    }

Итак, как мне изменить мою конфигурацию, чтобы использовать новый регистратор? Я не могу найти ни одного примера или документации по этому вопросу.

1 Ответ

0 голосов
/ 09 марта 2020

Я посмотрел, как это работает, и думаю, что вы не сможете использовать MigrateDatabaseToLatestVersion напрямую. Вы должны быть в состоянии переопределить это все же. Если вы посмотрите на фактическую логику c, то там все на самом деле довольно просто:

https://github.com/dotnet/ef6/blob/master/src/EntityFramework/MigrateDatabaseToLatestVersion%60.cs

    public virtual void InitializeDatabase(TContext context)
    {
        Check.NotNull(context, "context");

        var migrator = new DbMigrator(_config, _useSuppliedContext ? context : null);
        migrator.Update();
    }

Чтобы добавить в нее логи, создайте новую Реализация MigrateDatabaseToLatestVersionWithLogging, которая наследуется от стандарта MigrateDatabaseToLatestVersion, затем переопределяет метод и вводит декоратор ведения журнала перед вызовом update. Примерно так (не проверено):

https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.migrations.infrastructure.migratorloggingdecorator?view=entity-framework-6.2.0

    public override void InitializeDatabase(TContext context)
    {
        _ = context ?? throw new ArgumentNullException(nameof(context));

        var migrator = new MigratorLoggingDecorator(
            new DbMigrator(_config, _useSuppliedContext ? context : null),
            new EfLogger());

        migrator.Update();
    }
...