SQL миграция в Azure конвейеры с транзакциями - PullRequest
0 голосов
/ 17 февраля 2020

У нас работает конвейер сборки, который создает сценарий sql с использованием скрипта do tnet ef migrations -Idempotent, и это выполняется в нашем конвейере выпуска с помощью задачи "Azure SQL Развертывание базы данных" с использованием Invoke- Sqlcmd -ServerInstance "XXXXXXXXX" -Database "XXXXXX" -Username "XXXXXXX" -Password ****** -Inputfile "XXXXXXXXXX" -ConnectionTimeout 1800

Однако мы хотели бы запустить миграцию в транзакции, потому что теперь, если миграция не удалась, мы окажемся в состоянии, когда миграция наполовину завершена.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Если вы ищете способы использования EF-миграций для генерации sql сценария, обернутого транзакцией, проверьте этот поток , который создает класс MigrationScriptBuilder, унаследованный от SqlServerMigrationSqlGenerator.

Ниже приведен код вышеуказанного потока, вы можете увидеть "BEGIN TRAN" и "COMMIT TRAN" вокруг состояния миграции.

public class MigrationScriptBuilder : SqlServerMigrationSqlGenerator
{
#if !DEBUG
    protected override void Generate(SqlOperation sqlOperation)
    {
        Statement("GO");

        base.Generate(sqlOperation);

        Statement("GO");
    }

    public override IEnumerable<MigrationStatement> Generate(IEnumerable<MigrationOperation> migrationOperations, string providerManifestToken)
    {
        yield return new MigrationStatement {Sql = "BEGIN TRAN"};

        foreach (var migrationStatement in base.Generate(migrationOperations, providerManifestToken))
        {
            yield return migrationStatement;
        }

        yield return new MigrationStatement {Sql = "COMMIT TRAN"};
    }
#endif
}
0 голосов
/ 18 февраля 2020

Существует нечто, называемое SqlServerMigrationsSqlGenerator, которое помогает настроить генерацию сценария миграции. Спасибо @ ян-шен-мсфт!

Этот код требуется для ядра EF:

    public class SqlMigrationScriptGenerator : SqlServerMigrationsSqlGenerator
{
    public SqlMigrationScriptGenerator(MigrationsSqlGeneratorDependencies dependencies, IMigrationsAnnotationProvider migrationsAnnotations) : base(dependencies, migrationsAnnotations)
    {
    }

    public override IReadOnlyList<MigrationCommand> Generate(IReadOnlyList<MigrationOperation> operations, IModel model)
    {
        var beginTransaction = new SqlOperation { Sql = "BEGIN TRANSACTION" };
        var overriddenOperations = operations.ToList();
        overriddenOperations.Insert(0, beginTransaction);
        overriddenOperations.Add(new SqlOperation { Sql = "COMMIT TRANSACTION" });
        return base.Generate(overriddenOperations, model);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...