/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual string GenerateScript( string fromMigration = null, string toMigration = null, bool idempotent = false) { var skippedMigrations = _migrationsAssembly.Migrations .Where(t => string.Compare(t.Key, fromMigration, StringComparison.OrdinalIgnoreCase) < 0) .Select(t => t.Key); IReadOnlyList<Migration> migrationsToApply, migrationsToRevert; PopulateMigrations( skippedMigrations, toMigration, out migrationsToApply, out migrationsToRevert); var builder = new IndentedStringBuilder(); if (fromMigration == Migration.InitialDatabase || string.IsNullOrEmpty(fromMigration)) { builder.AppendLine(_historyRepository.GetCreateIfNotExistsScript()); builder.Append(_sqlGenerationHelper.BatchTerminator); } for (var i = 0; i < migrationsToRevert.Count; i++) { var migration = migrationsToRevert[i]; var previousMigration = i != migrationsToRevert.Count - 1 ? migrationsToRevert[i + 1] : null; _logger.LogDebug(RelationalStrings.GeneratingDown(migration.GetId())); foreach (var command in GenerateDownSql(migration, previousMigration)) { if (idempotent) { builder.AppendLine(_historyRepository.GetBeginIfExistsScript(migration.GetId())); using (builder.Indent()) { builder.AppendLines(command.CommandText); } builder.AppendLine(_historyRepository.GetEndIfScript()); } else { builder.AppendLine(command.CommandText); } builder.Append(_sqlGenerationHelper.BatchTerminator); } } foreach (var migration in migrationsToApply) { _logger.LogDebug(RelationalStrings.GeneratingUp(migration.GetId())); foreach (var command in GenerateUpSql(migration)) { if (idempotent) { builder.AppendLine(_historyRepository.GetBeginIfNotExistsScript(migration.GetId())); using (builder.Indent()) { builder.AppendLines(command.CommandText); } builder.AppendLine(_historyRepository.GetEndIfScript()); } else { builder.AppendLine(command.CommandText); } builder.Append(_sqlGenerationHelper.BatchTerminator); } } return builder.ToString(); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public override string GetCreateIfNotExistsScript() { var builder = new IndentedStringBuilder(); builder.Append("IF OBJECT_ID(N'"); if (TableSchema != null) { builder .Append(SqlGenerationHelper.EscapeLiteral(TableSchema)) .Append("."); } builder .Append(SqlGenerationHelper.EscapeLiteral(TableName)) .AppendLine("') IS NULL") .AppendLine("BEGIN"); using (builder.Indent()) { builder.AppendLines(GetCreateScript()); } builder.AppendLine("END;"); return builder.ToString(); }