Как работает LINQ RefreshMode?

В случае конфликта мне нужно перезаписать значения в базе данных с моими изменениями. Я нашел следующую статью в MSDN, которая объясняет, как разрешать конфликты с помощью RefreshMode:

http://msdn.microsoft.com/en-us/library/system.data.linq.refreshmode.aspx

Я решил, что KeepCurrentValues ​​имеет смысл для моего требования, и я также нашел эту страницу с примером для этого режима:

http://msdn.microsoft.com/en-us/library/bb399421.aspx

Однако, когда я реализовал это, значения из базы данных всегда записывали мои изменения. Я попытался изменить RefreshMode на OverwriteCurrentValues ​​и KeepChanges и каждый раз, когда сохранялись значения из базы данных. Мой подход заключался в том, чтобы вручную изменять значения в базе данных в режиме отладки в VisualStudio. Код в VS:

[MyDataContext] db = new [MyDataContext]();
try
{
    [MyLINQType] old = (from o in db.[MyLINQType] where o.ID=1 select o).Single();
    old.IntField = 55;

    // This is where I change the IntField value manually in the database in
    // debug mode to generate the conflict.
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException)
{
    db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);
}

Я знаю, что конфликт появляется, но каждый раз, независимо от того, как я изменяю RefreshMode, значение 55 никогда не сохраняется и изменения, которые я сделал вручную в базе данных, сохраняются. Есть ли уловка для достижения желаемого результата? Сначала я попытался создать конфликт изнутри кода, и это тоже не сработало. Возможно, я не понимал, как должен работать RefreshMode. Любые идеи приветствуются.

Ответ 1

Вам просто нужно снова вызвать SubmitChanges...

catch (ChangeConflictException)
{            
    db.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues);  
    db.SubmitChanges(); 
} 

Метод разрешения конфликтов определяет состояние DataContext, а не базовую базу данных.

KeepCurrentValues ​​ означает сохранить все значения, поскольку они в настоящее время находятся в DataContext, что означает, что следующий вызов SubmitChanges сохранит любые изменения, внесенные пользователем, но также будут перезаписывать любые изменения, сделанные другими пользователями после того, как данные были загружены текущим пользователем.

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

OverwriteCurrentValues ​​означает обновление DataContext с текущими значениями базы данных, что означает, что все изменения, сделанные текущим пользователем, будут отброшены.

Ответ 2

Перед изменением данных вы обновляете свой объект путем перезаписи с Db:

[MyLINQType] old = (from o in db.[MyLINQType] where o.ID=1 select o).Single();
Db.Refresh(RefreshMode.OverwriteCurrentValues, old);
old.IntField = 55;
db.SubmitChanges(ConflictMode.ContinueOnConflict);