异常

时间:2018-02-16 14:22:30

标签: entity-framework

当我在EF遇到异常时,我正在做以下事情......

public virtual int SaveChanges()
{
    try
    {
        return context.SaveChanges();
    }
    catch (DbEntityValidationException vex)
    {
        foreach (var error in vex.EntityValidationErrors)
        {
            error.Entry.State = EntityState.Unchanged;
        }
        throw;
    }
    catch (DbUpdateException uex)
    {
        foreach (var error in uex.Entries)
        {
            error.State = EntityState.Unchanged;
        }
        throw;
    }
}

这样做的原因是还原导致问题的待处理实体,以便可以应用进一步的更改。这很有效。

现在我要一次性进行多项更改,如果有异常,我希望所有这些更改都可以恢复。所以我创建了一个事务,开始进行更改,并在异常时调用Rollback。问题是在发生异常之前成功的任何更改都会保留并且不会回滚。如果我删除代码以将待处理的问题设置为EntityState.Unchanged,则回滚可以正常工作,但是上下文现在无法使用,因为有未决的更改会导致进一步提交的问题。

希望他们能够很好地解释一切。感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

  

在异常发生之前成功的任何更改仍然存在且不会回滚。

正确。当您调用SaveChanges()并稍后回滚事务EF并且数据库不同意您的实体状态时。

在这种情况下,您需要在完成所有更改之后推迟调用SaveChanges()。然后,DbContext和数据库将始终就您的更改结果达成一致。