Мы добавили ключ командной строки '-debug' в наше консольное приложение DbUp.Если это присутствует, мы переключаемся, какой класс Journal используется при обращении к базе данных.
Класс Journal (https://dbup.readthedocs.io/en/latest/more-info/journaling/) в DbUp - это класс, который взаимодействует с базой данных, чтобы проверять и записывать, какие сценарии уже были выполнены (по умолчанию хранятся в таблице версий схемы). Для Devмы заставляем его использовать версию только для чтения, которая может проверять, какие сценарии уже присутствуют (для предотвращения повторного запуска все каждый раз), но предотвращает запись новых записей, так что в следующий разпопытается снова запустить ваши новые сценарии.
Журнал только для чтения выглядит следующим образом;
public class ReadOnlyJournal : IJournal
{
private readonly IJournal _innerJournal;
public ReadOnlyJournal(IJournal innerJournal)
{
_innerJournal = innerJournal;
}
public void EnsureTableExistsAndIsLatestVersion(Func<IDbCommand> dbCommandFactory)
{
_innerJournal.EnsureTableExistsAndIsLatestVersion(dbCommandFactory);
}
public string[] GetExecutedScripts()
{
return _innerJournal.GetExecutedScripts().ToArray();
}
public void StoreExecutedScript(SqlScript script, Func<IDbCommand> dbCommandFactory)
{
// don't store anything
}
}
Затем метод расширения, позволяющий упростить указание использования этого нового журнала.;
public static class DbUpHelper
{
public static UpgradeEngineBuilder WithReadOnlyJournal(this UpgradeEngineBuilder builder, string schema, string table)
{
builder.Configure(c => c.Journal = new ReadOnlyJournal(new SqlTableJournal(() => c.ConnectionManager, () => c.Log, schema, table)));
return builder;
}
}
И, наконец, изменения в консольном приложении DbUp;
var upgrader = debug
? DeployChanges.To
.SqlDatabase(connectionString)
.WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
.WithReadOnlyJournal("dbo", "SchemaVersions")
.LogToConsole()
.Build()
: DeployChanges.To
.SqlDatabase(connectionString)
.WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
.LogToConsole()
.Build();
var result = upgrader.PerformUpgrade();
if (!result.Successful)
....