当我在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,则回滚可以正常工作,但是上下文现在无法使用,因为有未决的更改会导致进一步提交的问题。
希望他们能够很好地解释一切。感谢您的任何建议。
答案 0 :(得分:0)
在异常发生之前成功的任何更改仍然存在且不会回滚。
正确。当您调用SaveChanges()并稍后回滚事务EF并且数据库不同意您的实体状态时。
在这种情况下,您需要在完成所有更改之后推迟调用SaveChanges()。然后,DbContext和数据库将始终就您的更改结果达成一致。