如果我在已删除的实体上调用EF Reload会怎样?

时间:2016-05-02 19:35:00

标签: entity-framework entity-framework-6

我正在尝试实现乐观并发,

while (true) {
    var e = db.MyTable.FirstOrDefault();
    try {
         // make changes to e
         db.SaveChanges();
         return;
    } catch (DBConcurrencyException ex) {
         db.Entry(e).Reload();
         if (e == null) return;    // <===  this can't be right?!
    }
}

如果在我对e进行更改时,另一个作业会从数据库中删除该行,会发生什么。会发生什么? SaveChanges会成功吗?

或者,如果在重新加载之前,另一个作业会删除该行?在这种情况下,Reload会将e设置为null吗?或者Reload会抛出异常?我擦洗了文档,但找不到任何提示。

1 个答案:

答案 0 :(得分:2)

SaveChanges无法成功 - 行不再在此处,因此无需更新。如果成功,你的意思是它将默默地继续,然后也不会 - 它将抛出DbUpdateConcurrencyException(注意, DBConcurrencyException你在你的例子中捕获。)

如果您Reload已删除实体,则其状态为Detacheddb.Entry(e).State)。方法调用无法将e变量设置为null,即使原则上也是如此 - 它不会被ref传递。