2012-05-15 2 views
2

Так что это довольно простой вопрос, на который мне пока не удалось найти ответ. Таким образом, ситуация выглядит следующим образом:RefreshMode.ClientWins с несколькими пользователями, что происходит?

  • User1 инициализирует ObjectContext
  • Пользователь2 инициализирует другой ObjectContext того же типа
  • Пользователь1 изменяет предприятие А
  • Пользователь2 изменения сущности B
  • Пользователь2 сохраняет изменения
  • User1 обновляет с помощью RefreshMode.ClientWins и продолжает сохранять изменения

Так что же происходит с сущностью B? Пользователь1 не изменил его, но отличается от версии в базе данных. Моя кишка скажет, что, поскольку User1 не внес никаких изменений в объект B, он останется в состоянии, в котором User2 оставил его. Но, увы, я не уверен, и поэтому я спрашиваю кого-то, кто знает лучше.

ответ

2

Ваши ожидания верны - ничего не произойдет с объектом B, поскольку в базе данных изменений не было, поэтому обновление ничего не делало.

Объектный контекст внутренне отслеживает два набора значений для каждого отслеживаемого объекта - исходные и текущие значения. Исходными значениями являются значения, загруженные из базы данных, а текущие значения являются действительными значениями, измененными вашим приложением после загрузки объекта.

При вызова Refresh с режимом ClientWins контекст будет запрашивать базу данных для объекта, обновляет все исходные значения в отслеживаемой записи для лица и обновляет текущие значения, которые еще не были изменены приложениями - значения, которые уже были изменения не обновляются (то есть клиент выигрывает обновление).

При выполнении SaveChanges EF будет определять изменения путем сравнения исходных значений и текущих значений и создавать команду обновления только для измененных столбцов. ClientWins Режим обновления используется в сценариях с оптимистичным параллелизмом, чтобы принудительно перезаписать изменения базы данных новыми значениями.

3

RefreshMode.ClientWins влияет только на сохранение местных изменений. Если локальных изменений нет, нет никакой разницы между RefreshMode.ClientWins и RefreshMode.StoreWins.

Я вижу, что documentation немного запутанная:

режима В StoreWins означает, что объект должен быть обновлен, чтобы соответствовать значениям исходных данных. Значение ClientWins означает, что будут сохраняться только изменения в контексте объекта, даже если в источнике данных были другие изменения.

Изменения в контексте объекта не сохраняются с RefreshMode.ClientWins, но в документации четко не сказано.

Смежные вопросы