我有两个相关的表:dbo.resources
和dbo.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)? “引擎盖下”究竟发生了什么?
答案 0 :(得分:3)
根据参考文章found here:
调用Refresh方法后,将始终使用数据源值更新对象的原始值,但可能会更新当前值,也可能不会使用数据源值更新当前值。这取决于RefreshMode。 StoreWins模式意味着应更新对象以匹配数据源值。 ClientWins值意味着即使数据源中有其他更改,也只会保留对象上下文中的更改。 要确保数据源端逻辑更新了对象,可以在调用SaveChanges方法后使用StoreWins值调用Refresh方法。