首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果C# EntityFramework Up方法在中间失败了怎么办?

问如果C# EntityFramework Up方法在中间失败了怎么办?
EN

Stack Overflow用户
提问于 2016-11-23 16:23:42
回答 1查看 101关注 0票数 0

我正在使用实体框架。这是我的up方法:

代码语言:javascript
复制
public override void Up()
    {
        AddColumn("Users", "atribute21", c => c.String(unicode: false));

        Sql("wrong sql command");
    }

我强烈地编写了一个糟糕的sql命令,重点是将要执行的sql代码是:

代码语言:javascript
复制
 alter table `Users` add column `atribute21` longtext 
 wrong sql command

因此,实体框架将执行第一个sql语句,并在我的数据库中更改属性"atribute21",但在此之后,它将失败,表__migrationhistory不会被修改。

因此,实体框架实际上处于不一致的状态。使用update命令对数据库进行了一些更改,但迁移尚未完成。事实上,我甚至不能回滚更新-数据库TargetMigration:“迁移”,或更新-数据库或任何东西。

解决这一问题的唯一方法是手动删除users表中的"atribute21“,删除错误的sql代码并再次迁移。这个解决方案在本例中非常简单,但它是不可伸缩的,例如,如果我在up方法中有30个sql命令来填充数据库中的数据,而其中一个命令失败了,那么怎么办?

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

在实体框架中,up方法不应该默认为sql事务吗?

如何配置实体框架以实现up方法将是sql事务?

注意:我发现将sql和sql添加到up方法是一种方法,但我认为这不是一个好的解决方案,我想要一些自动的解决方案。

编辑:

当您使用时,up方法中的自动回滚是存在的,但是我使用的是MySQL/MariaDb,并且不会发生。

EN

回答 1

Stack Overflow用户

发布于 2016-11-23 17:37:24

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

“如何配置实体框架以实现up方法将是一个sql?”?

尝试使用TransactionScope

代码语言:javascript
复制
using System.Transactions;

代码:

代码语言:javascript
复制
using (TransactionScope transaction = new TransactionScope())
{
    try
    {
        //Do whatever

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

“up方法不应该是实体框架中默认的sql事务吗?”?

  • @IgorQuirino我试过了,没有发生回滚,即使更新-数据库命令失败,数据库也会被修改。
  • 所以不..。

很高兴帮你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40769499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档