in EFCore/src/Migrations/Internal/MySQLMigrator.cs [516:606]
protected virtual bool VerifyMigrationSucceeded(
string? targetMigration, MigrationExecutionState state)
=> false;
protected virtual Task<bool> VerifyMigrationSucceededAsync(
string? targetMigration, MigrationExecutionState state, CancellationToken cancellationToken)
=> Task.FromResult(false);
public virtual string GenerateScript(
string? fromMigration = null,
string? toMigration = null,
MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default)
{
options |= MigrationsSqlGenerationOptions.Script;
var idempotent = options.HasFlag(MigrationsSqlGenerationOptions.Idempotent);
var noTransactions = options.HasFlag(MigrationsSqlGenerationOptions.NoTransactions);
IEnumerable<string> appliedMigrations;
if (string.IsNullOrEmpty(fromMigration)
|| fromMigration == Migration.InitialDatabase)
{
appliedMigrations = Enumerable.Empty<string>();
}
else
{
var fromMigrationId = _migrationsAssembly.GetMigrationId(fromMigration);
appliedMigrations = _migrationsAssembly.Migrations
.Where(t => string.Compare(t.Key, fromMigrationId, StringComparison.OrdinalIgnoreCase) <= 0)
.Select(t => t.Key);
}
PopulateMigrations(appliedMigrations, toMigration, out var migratorData);
var builder = new IndentedStringBuilder();
if (fromMigration == Migration.InitialDatabase
|| string.IsNullOrEmpty(fromMigration))
{
builder
.Append(_historyRepository.GetCreateIfNotExistsScript())
.Append(_sqlGenerationHelper.BatchTerminator);
}
var idempotencyEnd = idempotent
? _historyRepository.GetEndIfScript()
: null;
var migrationsToApply = migratorData.AppliedMigrations;
var migrationsToRevert = migratorData.RevertedMigrations;
var actualTargetMigration = migratorData.TargetMigration;
var transactionStarted = false;
for (var i = 0; i < migrationsToRevert.Count; i++)
{
var migration = migrationsToRevert[i];
var previousMigration = i != migrationsToRevert.Count - 1
? migrationsToRevert[i + 1]
: actualTargetMigration;
_logger.MigrationGeneratingDownScript(this, migration, fromMigration, toMigration, idempotent);
var idempotencyCondition = idempotent
? _historyRepository.GetBeginIfExistsScript(migration.GetId())
: null;
GenerateSqlScript(
GenerateDownSql(migration, previousMigration, options),
builder, _sqlGenerationHelper, ref transactionStarted, noTransactions, idempotencyCondition, idempotencyEnd);
}
foreach (var migration in migrationsToApply)
{
_logger.MigrationGeneratingUpScript(this, migration, fromMigration, toMigration, idempotent);
var idempotencyCondition = idempotent
? _historyRepository.GetBeginIfNotExistsScript(migration.GetId())
: null;
GenerateSqlScript(
GenerateUpSql(migration, options),
builder, _sqlGenerationHelper, ref transactionStarted, noTransactions, idempotencyCondition, idempotencyEnd);
}
if (transactionStarted)
{
builder
.AppendLine(_sqlGenerationHelper.CommitTransactionStatement)
.Append(_sqlGenerationHelper.BatchTerminator);
}
return builder.ToString();
}