Как работает LINQ RefreshMode? - PullRequest
12 голосов
/ 30 марта 2011

В случае конфликта, мне нужно перезаписать значения в базе данных моими изменениями. Я нашел следующую статью на 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. Любые идеи приветствуются.

Ответы [ 2 ]

15 голосов
/ 10 апреля 2011

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

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

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

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

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

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

1 голос
/ 01 октября 2012

Перед изменением данных вы обновляете свой объект, перезаписывая из 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);
...