2

我有两个相关的表:dbo.resourcesdbo.reservation; dbo.resources有一个指向选项的外dbo.reservationON DELETE SET NULL。我还有一个“之后”触发器dbo.resources,当资源被删除时,它会删除保留。

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)?“幕后”究竟发生了什么?

4

1 回答 1

3

根据此处找到的参考文章:

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

于 2013-04-10T15:43:32.433 回答