2016-11-23 31 views
0

我正在使用实体框架。 这是我的了方法: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的,并不会发生。

+0

我认为发生回滚... –

+1

@IgorQuirino我试过了,回滚没有发生,即使update-database命令失败,数据库也会被修改。 –

+0

还请记住,您应该使用Down()代码来反转迁移。 –

回答

0

“我如何使用实体框架从此恢复?”

“如何配置实体框架以实现up方法将成为sql事务?”

使用的TransactionScope尝试

using System.Transactions; 

代码:

using (TransactionScope transaction = new TransactionScope()) 
{ 
    try 
    { 
     //Do whatever 

     transaction.Complete(); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

“不应该up方法在实体框架默认情况下,SQL事务?”

  • @IgorQuirino我尝试过了,不会发生回滚,数据库甚至与更新的数据库命令失败修改。
  • 所以,不...

高兴地帮助你!

相关问题