Код отладки, вызываемый EF Core Add-Migrations

У меня есть база данных Entity Framework Core, определенная в отдельной сборке с использованием шаблона IDesignTimeDbContextFactory<> (т. Е. Я определяю класс, производный от IDesignTimeDbContextFactory, у которого есть метод с именем CreateDbContext, который возвращает экземпляр контекста базы данных).

Поскольку приложение, частью которого является база данных EF Core, использует внедрение зависимостей AutoFac, класс фабрики IDesignTimeDbContextFactory<> создает контейнер AutoFac в своем конструкторе, а затем разрешает производный класс DbContextOptionsBuilder<>, который передается в конструктор для базы данных. контекст (я делаю это, чтобы контролировать локальную базу данных или базу данных SqlServer на основе Azure, основываясь на параметре файла конфигурации, с паролями, хранящимися в Azure KeyVault):

public class TemporaryDbContextFactory : IDesignTimeDbContextFactory<FitchTrustContext>
{
    private readonly FitchTrustDBOptions _dbOptions;

    public TemporaryDbContextFactory()
    {
        // OMG, I would >>never<< have thought to do this to eliminate the default logging by this
        // deeply-buried package. Thanx to Bruce Chen via 
        // https://stackru.com/questions/47982194/suppressing-console-logging-by-azure-keyvault/48016958#48016958
        LoggerCallbackHandler.UseDefaultLogging = false;

        var builder = new ContainerBuilder();

        builder.RegisterModule<SerilogModule>();
        builder.RegisterModule<KeyVaultModule>();
        builder.RegisterModule<ConfigurationModule>();
        builder.RegisterModule<FitchTrustDbModule>();

        var container = builder.Build();

        _dbOptions = container.Resolve<FitchTrustDBOptions>() ??
                     throw new NullReferenceException(
                         $"Could not resolve {typeof(FitchTrustDBOptions).Name}");
    }

    public FitchTrustContext CreateDbContext( string[] args )
    {
        return new FitchTrustContext( _dbOptions );
    }
}

public class FitchTrustDBOptions : DbContextOptionsBuilder<FitchTrustContext>
{
    public FitchTrustDBOptions(IFitchTrustNGConfigurationFactory configFactory, IKeyVaultManager kvMgr)
    {
        if (configFactory == null)
            throw new NullReferenceException(nameof(configFactory));

        if (kvMgr == null)
            throw new NullReferenceException(nameof(kvMgr));

        var scannerConfig = configFactory.GetFromDisk()
                            ?? throw new NullReferenceException(
                                "Could not retrieve ScannerConfiguration from disk");

        var dbConnection = scannerConfig.Database.Connections
                               .SingleOrDefault(c =>
                                   c.Location.Equals(scannerConfig.Database.Location,
                                       StringComparison.OrdinalIgnoreCase))
                           ?? throw new ArgumentOutOfRangeException(
                               $"Cannot find database connection information for location '{scannerConfig.Database.Location}'");

        var temp = kvMgr.GetSecret($"DatabaseCredentials--{dbConnection.Location}--Password");

        var connString = String.IsNullOrEmpty(dbConnection.UserID) || String.IsNullOrEmpty(temp)
            ? dbConnection.ConnectionString
            : $"{dbConnection.ConnectionString}; User ID={dbConnection.UserID}; Password={temp}";

        this.UseSqlServer(connString,
            optionsBuilder =>
                optionsBuilder.MigrationsAssembly(typeof(FitchTrustContext).GetTypeInfo().Assembly.GetName()
                    .Name));
    }
}

Излишне говорить, что, хотя это дает мне большую гибкость (я могу переключаться с локальной на облачную базу данных, просто изменяя один параметр конфигурации, и любые необходимые пароли достаточно надежно хранятся в облаке), это может привести к отключению надстройки. командлет миграции, если в коде есть ошибка (например, неправильное имя файла конфигурации).

Для устранения подобных проблем мне часто приходилось прибегать к выводу сообщений в окно вывода Visual Studio с помощью диагностических вызовов WriteLine. Это кажется мне довольно примитивным (не говоря уже о длительности).

Есть ли способ присоединить отладчик к моему коду, который вызывается методом add-igration, чтобы я мог пройти через него, проверить значения и т. Д.? Я попытался вставить строку отладчика Launch() в мой код, но это не работает. Кажется, это бросает меня в кодовую базу add-manager, для которой у меня нет загруженных символов, и точки останова, которые я пытаюсь установить в своем коде, отображаются в виде пустого красного круга: они никогда не попадут.

Мысли и предложения будут приветствоваться!

1 ответ

Добавлять Debugger.Launch() в начале конструктора для запуска отладчика точно в срок. Это позволяет вам присоединить VS к процессу и отладить его как обычно.

Другие вопросы по тегам