首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用事务在Azure管道中迁移SQL

使用事务在Azure管道中迁移SQL
EN

Stack Overflow用户
提问于 2020-02-17 21:46:02
回答 2查看 308关注 0票数 0

我们有一个正在运行的构建管道,它使用dotnet ef迁移脚本-Idempotent创建一个SQL脚本,并使用Invoke-Sqlcmd -ServerInstance "XXXXXXXXX“-Database "XXXXXX”-Username "XXXXXXX“-Password * -Inputfile "XXXXXXXXXX”-ConnectionTimeout 1800任务"Azure sql Database deployment“在我们的发布管道中执行。

但是,我们希望在事务中运行迁移,因为现在,如果迁移失败,我们最终会处于迁移已完成一半的状态。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-18 16:46:02

有一个名为SqlServerMigrationsSqlGenerator的工具可以帮助您定制迁移脚本生成。感谢@yang-shen-msft!

以下是EF核心所需的代码:

代码语言:javascript
复制
    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);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-02-19 09:21:14

如果您正在寻找使用EF迁移生成与事务包装在一起的sql脚本的方法,请查看this thread,它创建了一个从SqlServerMigrationSqlGenerator继承的MigrationScriptBuilder类。

下面是来自上述线程的代码,您可以看到迁移语句周围的"BEGIN TRAN“和"COMMIT TRAN”。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60263845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档