EntityFramework:关于OptimisticConcurrencyException

时间:2013-04-10 14:57:17

标签: entity-framework objectcontext optimistic-concurrency

我有两个相关的表:dbo.resourcesdbo.reservation; dbo.resources有一个外键,使用dbo.reservation选项指向ON DELETE SET NULL。我还在dbo.resources上有一个“after”触发器,删除资源时删除了一个预留。

当我尝试手动删除预留和资源时,我已“管理”提出OptimisticConcurrencyException,这看似正常。

然后我找到了问题,并将其删除,但现在我想通过捕获OptimisticConcurrencyException并刷新上下文来强制执行更强大的异常处理机制。

我的问题是:任何人都可以向我解释为什么这段代码:

 catch (System.Data.OptimisticConcurrencyException ocException)
        {
            foreach (var objectStateEntry in ocException.StateEntries)
                _Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, objectStateEntry.Entity);
            _Context.SaveChanges();
        }

不起作用,

而这一个:

 catch (System.Data.OptimisticConcurrencyException ocException)
        {
            foreach (var objectStateEntry in ocException.StateEntries)
                _Context.Refresh(System.Data.Objects.RefreshMode.StoreWins, objectStateEntry.Entity);
            _Context.SaveChanges();
        }

呢? EF如何处理每种情况下的对象上下文(StoreWins和ClientWins)? “引擎盖下”究竟发生了什么?

1 个答案:

答案 0 :(得分:3)

根据参考文章found here

  

调用Refresh方法后,将始终使用数据源值更新对象的原始值,但可能会更新当前值,也可能不会使用数据源值更新当前值。这取决于RefreshMode。 StoreWins模式意味着应更新对象以匹配数据源值。 ClientWins值意味着即使数据源中有其他更改,也只会保留对象上下文中的更改。   要确保数据源端逻辑更新了对象,可以在调用SaveChanges方法后使用StoreWins值调用Refresh方法。