我正在使用实体框架。 这是我的了方法:C#EntityFramework Up方法¿如果sql在中间失败怎么办?
public override void Up()
{
AddColumn("Users", "atribute21", c => c.String(unicode: false));
Sql("wrong sql command");
}
我intencionally写不好的SQL命令,该点是将要执行的将是SQL代码:
alter table `Users` add column `atribute21` longtext
wrong sql command
所以实体框架将执行第一sql语句并在我的数据库中更改属性“atribute21”,但在此之后它将失败并且表__migrationhistory不会被修改。
所以,实际上Entity框架变成了不一致的状态。使用update命令对数据库进行了一些更改,但迁移未完成。实际上,我甚至可以不使用update-database TargetMigration进行回滚:“迁移”或更新数据库或任何其他内容。
解决此问题的唯一方法是手动删除用户表中的“atribute21”,删除错误的sql代码并再次迁移。这个例子中的这个解决方案非常简单,但它不具有可伸缩性,例如,如果我在up方法中填充了30个sql命令以填充数据库中的数据,并且其中一个失败,那怎么办?
¿我如何使用实体框架从此恢复?
Â不应该在实体框架中默认的up方法是一个sql事务吗?
¿如何配置实体框架以实现up方法将成为sql事务?
注意: 我发现在up方法中添加sql begin和sql end是一种方法,但我认为这不是一个好的解决方案,我希望自动执行某些操作。
编辑:当您使用Microsoft SQL Server
自动回滚up方法存在的,但我使用MySQL/MariaDB的,并不会发生。
我认为发生回滚... –
@IgorQuirino我试过了,回滚没有发生,即使update-database命令失败,数据库也会被修改。 –
还请记住,您应该使用Down()代码来反转迁移。 –