具有多个用户的RefreshMode.ClientWins,会发生什么?

时间:2012-05-15 07:42:53

标签: c# entity-framework

所以这是一个非常简单的问题,我还没有找到答案。 情况如下:

  • User1初始化objectcontext
  • User2初始化另一个相同类型的objectcontext
  • User1更改实体A
  • User2更改实体B
  • User2保存更改
  • User1使用RefreshMode.ClientWins进行刷新并继续保存更改

那么实体B会发生什么? User1没有更改它,但它与数据库中的版本不同。我的直觉会说,因为User1没有对实体B进行任何更改,它将保持User2离开它的状态。但是唉,我不确定,因此我会问一个知道更好的人。

2 个答案:

答案 0 :(得分:3)

RefreshMode.ClientWins仅影响是否保留本地更改。如果没有本地更改,则RefreshMode.ClientWinsRefreshMode.StoreWins之间没有区别。

我发现documentation有点令人困惑:

  

StoreWins模式意味着应更新对象以匹配数据源值。 ClientWins值意味着只有对象上下文中的更改才会保留,即使数据源中有其他更改也是如此。

RefreshMode.ClientWins不会保留对象上下文中的非更改,但文档并未明确说明。

答案 1 :(得分:2)

您的期望是正确的 - 实体B不会发生任何事情,因为数据库中没有任何更改,因此刷新没有做任何事情。

对象上下文在内部跟踪每个被跟踪实体的两组值 - 原始值和当前值。原始值是从数据库加载的值,当前值是加载实体后应用程序修改的实际值。

当您使用Refresh模式调用ClientWins时,上下文将向数据库查询实体,更新实体的跟踪记录中的所有原始值,并更新当前未更改的值应用程序 - 已更改的值未更新(即客户端获胜刷新)。

执行SaveChanges时,EF会通过比较原始值和当前值来检测更改,并仅为更改的列创建更新命令。 ClientWins刷新模式用于具有乐观并发性的方案中,以强制用新值覆盖数据库更改。