回滚失败的迁移:EF Core MySQL

时间:2020-05-04 19:19:48

标签: mysql pomelo-entityframeworkcore-mysql

使用:

  • Pomelo.EntityFrameworkCore.MySQL 3.1.1
  • Microsoft.EntityFrameworkCore 3.1.3
  • MySQL 5.7

看来,如果EF Core的update-database命令失败,则不会执行部分迁移的回滚。那是应该如何工作的?如果是这样,我很好奇为什么?更重要的是,当update-database发生错误时,是否有办法自动进行回滚,或者至少可以在以后手动进行回滚?我已经尝试过这样的事情:


protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.Sql("Start Transaction;");
...

    migrationBuilder.Sql("Commit;");
}

,但是之后运行Rollback;则无济于事。谢谢!

1 个答案:

答案 0 :(得分:2)

看来,如果EF Core的update-database命令失败,则不会执行部分迁移的回滚。那是应该如何工作的?如果是这样,我很好奇为什么?

虽然EF Core和Pomelo都支持将迁移作为事务的一部分进行应用(并且实际上默认情况下是这样做的),但是MySQL本身将隐式地分别提交每个结构更改语句。

有关更多信息,请参见以下文章:

更重要的是,当更新数据库出现错误时,是否有一种方法可以使回滚自动发生,或者至少可以在以后手动运行?

安全地为MySQL应用迁移的唯一可靠方法是使用备份/还原手动回滚任何部分应用的迁移:

  1. 备份数据库
  2. 应用脚本化迁移
  3. 如果迁移失败,请还原以前的数据库备份

还有其他数据库系统,例如SQL Server或PostgreSQL,支持事务安全的结构更改语句,而MySQL不支持。