Entity framework core Azure管道中带有事务的SQL迁移
我们有一个正在运行的构建管道,它使用dotnet ef migrations script-Idempotent创建一个sql脚本 这是在我们的发布管道中使用任务“Azure SQL数据库部署”执行的,任务使用Invoke-Sqlcmd-ServerInstance“XXXXXXXXX”-Database“XXXXXX”-Username“XXXXXXX”-Password********-Inputfile“xxxxxxxxxxxxx”-ConnectionTimeout 1800 但是,我们希望在事务中运行迁移,因为现在,如果迁移失败,我们将处于迁移完成一半的状态Entity framework core Azure管道中带有事务的SQL迁移,entity-framework-core,azure-pipelines,Entity Framework Core,Azure Pipelines,我们有一个正在运行的构建管道,它使用dotnet ef migrations script-Idempotent创建一个sql脚本 这是在我们的发布管道中使用任务“Azure SQL数据库部署”执行的,任务使用Invoke-Sqlcmd-ServerInstance“XXXXXXXXX”-Database“XXXXXX”-Username“XXXXXXX”-Password********-Inputfile“xxxxxxxxxxxxx”-ConnectionTimeout 1800 但是,我们
有什么想法吗?有一个名为SQLServerMigrationSqlGenerator的工具可以帮助您自定义迁移脚本生成。 谢谢@yang shen msft 这是EF core中要求的代码:
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);
}
}
公共类SqlMigrationScriptGenerator:SQLServerMigrationSqlGenerator
{
公共SqlMigrationScriptGenerator(MigrationSqlGeneratorDependencies依赖项,IMiglationAnnotationProvider MigrationAnnotations):基础(依赖项,MigrationAnnotations)
{
}
公共重写IReadOnlyList生成(IReadOnlyList操作,IModel模型)
{
var beginTransaction=new SqlOperation{Sql=“BEGIN TRANSACTION”};
var overridedenoperations=operations.ToList();
重写操作。插入(0,beginTransaction);
添加(新的SqlOperation{Sql=“COMMIT TRANSACTION”});
返回base.Generate(重写操作、模型);
}
}
如果您正在寻找使用EF迁移生成包含事务的sql脚本的方法,请检查从
SqlServerMigrationSqlGenerator
继承的创建MigrationScriptBuilder
类的方法
下面是上面线程中的代码,您可以看到migrationstatement周围的“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
}
公共类MigrationScriptBuilder:SqlServerMigrationSqlGenerator
{
#如果!调试
受保护的覆盖无效生成(SqlOperation SqlOperation)
{
声明(“GO”);
base.Generate(sqlOperation);
声明(“GO”);
}
公共重写IEnumerable生成(IEnumerable迁移操作,字符串providerManifestToken)
{
返回新的MigrationStatement{Sql=“BEGIN TRAN”};
foreach(base.Generate中的var migrationStatement(migrationOperations,providerManifestToken))
{
收益率迁移报表;
}
返回新的MigrationStatement{Sql=“COMMIT TRAN”};
}
#恩迪夫
}
这是否回答了您的问题?不,恐怕不行。这些问题包括如何回滚迁移。我不是在寻找如何手动回滚。我正在寻找如何确保迁移使用从生成的脚本调用Sqlcmd对数据库执行所有操作或不执行任何操作。但是,我真的愿意接受任何在管道中迁移数据库并在失败时自动回滚的工作流。您是否正在寻找使用ef迁移生成包含事务的sql脚本的方法?如果是,请检查哪一个应该是解决方案。