2

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

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

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

4

2 回答 2

3

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

我看到文档有点混乱:

StoreWins 模式意味着应该更新对象以匹配数据源值。ClientWins 值意味着只有对象上下文中的更改将被持久化,即使数据源中有其他更改。

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

于 2012-05-15T08:00:56.120 回答
2

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

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

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

当您执行SaveChangesEF 时,将通过比较原始值和当前值来检测更改,并仅为更改的列创建更新命令。ClientWins刷新模式用于乐观并发的场景,以强制用新值覆盖数据库更改。

于 2012-05-15T08:07:32.397 回答