所以这是一个非常简单的问题,我还没有找到答案。 情况如下:
那么实体B会发生什么? User1没有更改它,但它与数据库中的版本不同。我的直觉会说,因为User1没有对实体B进行任何更改,它将保持User2离开它的状态。但是唉,我不确定,因此我会问一个知道更好的人。
答案 0 :(得分:3)
RefreshMode.ClientWins
仅影响是否保留本地更改。如果没有本地更改,则RefreshMode.ClientWins
和RefreshMode.StoreWins
之间没有区别。
我发现documentation有点令人困惑:
StoreWins模式意味着应更新对象以匹配数据源值。 ClientWins值意味着只有对象上下文中的更改才会保留,即使数据源中有其他更改也是如此。
RefreshMode.ClientWins
不会保留对象上下文中的非更改,但文档并未明确说明。
答案 1 :(得分:2)
您的期望是正确的 - 实体B不会发生任何事情,因为数据库中没有任何更改,因此刷新没有做任何事情。
对象上下文在内部跟踪每个被跟踪实体的两组值 - 原始值和当前值。原始值是从数据库加载的值,当前值是加载实体后应用程序修改的实际值。
当您使用Refresh
模式调用ClientWins
时,上下文将向数据库查询实体,更新实体的跟踪记录中的所有原始值,并更新当前未更改的值应用程序 - 已更改的值未更新(即客户端获胜刷新)。
执行SaveChanges
时,EF会通过比较原始值和当前值来检测更改,并仅为更改的列创建更新命令。 ClientWins
刷新模式用于具有乐观并发性的方案中,以强制用新值覆盖数据库更改。