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.StoreWins
之间没有区别。
我看到文档有点混乱:
StoreWins 模式意味着应更新对象以匹配数据源值。ClientWins 值意味着将仅保留对象上下文中的更改,即使数据源中存在其他更改也是如此。
对象上下文中的非更改不会保留在RefreshMode.ClientWins
中,但文档没有明确说明。
您的期望是正确的 - 实体 B 不会发生任何事情,因为数据库中没有更改,因此刷新没有任何作用。
对象上下文在内部跟踪每个跟踪实体的两组值 - 原始值和当前值。原始值是从数据库加载的值,当前值是应用程序在加载实体后修改的实际值。
当您使用 ClientWins
模式调用 Refresh
时,上下文将查询数据库中的实体,更新实体跟踪记录中的所有原始值,并更新应用程序尚未更改的当前值 - 已更改的值不会更新(即客户端赢得刷新(。
执行SaveChanges
EF 将通过比较原始值和当前值来检测更改,并仅为更改的列创建更新命令。 ClientWins
刷新模式用于具有乐观并发的方案中,以强制用新值覆盖数据库更改。