private bool HandleDatabaseMigration(MigrationExecutionInfo pendingMigration)
{
// create a new DbMigrator using a specific target database because
// the GenericMigrator in pendingMigration can't be used directly as
// it doesn't have the specific database information, and the connection
// can't be changed after the fact
var targetedMigrator = GetDbMigrator(
pendingMigration.Migration.Assembly,
pendingMigration.Migration.ConfigurationType,
m_ConnectionInfoBuilder.Build(m_Config.Database, m_Config.AuthMode, m_Config.SqlLogin, m_Config.SqlPassword));
if (targetedMigrator == null)
{
Log.Warning(
"Cannot perform migration on {endPointServer}\\{endpointDatabase} to {targetMigrationId} " +
"for configuration {configType} using migration source {migrationSource} assembly.",
m_Config.Database.ServerName,
m_Config.Database.DatabaseName,
string.IsNullOrEmpty(pendingMigration.TargetMigrationId)
? "LATEST"
: pendingMigration.TargetMigrationId,
pendingMigration.Migration.ConfigurationType,
pendingMigration.Migration.Source);
return false;
}
Log.Information(
"Migrating {endPointServer}\\{endpointDatabase} to {targetMigrationId} for " +
"configuration {configType} using a migration source of {migrationSource} assembly",
m_Config.Database.ServerName,
m_Config.Database.DatabaseName,
string.IsNullOrEmpty(pendingMigration.TargetMigrationId)
? "LATEST"
: pendingMigration.TargetMigrationId,
pendingMigration.Migration.ConfigurationType,
pendingMigration.Migration.Source);
using (var migrationTransaction = new TransactionScope(TransactionScopeOption.Required))
{
if (string.IsNullOrEmpty(pendingMigration.TargetMigrationId))
{
//Null target migration id means we're going to the latest version
targetedMigrator.Update();
}
else
{
targetedMigrator.Update(pendingMigration.TargetMigrationId);
}
migrationTransaction.Complete();
}
return true;
}