RefreshMode.ClientWins 与多个用户,会发生什么

本文关键字:什么 用户 ClientWins RefreshMode | 更新日期: 2023-09-27 18:34:22

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

  • 用户 1 初始化对象上下文
  • User2 初始化另一个相同类型的对象上下文
  • 用户 1 更改实体 A
  • 用户 2 更改实体 B
  • 用户 2 保存更改
  • User1 使用 RefreshMode.ClientWins 执行刷新并继续保存更改

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

RefreshMode.ClientWins 与多个用户,会发生什么

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

我看到文档有点混乱:

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

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

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

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

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

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