Код отладки, вызываемый 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 к процессу и отладить его как обычно.