我们有一个正在运行的构建管道,它使用dotnet ef迁移脚本-Idempotent创建一个SQL脚本,并使用Invoke-Sqlcmd -ServerInstance "XXXXXXXXX“-Database "XXXXXX”-Username "XXXXXXX“-Password * -Inputfile "XXXXXXXXXX”-ConnectionTimeout 1800任务"Azure sql Database deployment“在我们的发布管道中执行。
但是,我们希望在事务中运行迁移,因为现在,如果迁移失败,我们最终会处于迁移已完成一半的状态。
有什么想法吗?
发布于 2020-02-18 16:46:02
有一个名为SqlServerMigrationsSqlGenerator的工具可以帮助您定制迁移脚本生成。感谢@yang-shen-msft!
以下是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);
}
}发布于 2020-02-19 09:21:14
如果您正在寻找使用EF迁移生成与事务包装在一起的sql脚本的方法,请查看this thread,它创建了一个从SqlServerMigrationSqlGenerator继承的MigrationScriptBuilder类。
下面是来自上述线程的代码,您可以看到迁移语句周围的"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
}https://stackoverflow.com/questions/60263845
复制相似问题