2010-07-21 2 views
4

Это параллелизм. Таким образом, метод SubmitChanges() завершается с ошибкой, и возникает исключение ChangeConflictException. Для каждого объекта ObjectChangeConflict в db.ChangeConflicts, его Resolve установлен в RefreshMode.OverwriteCurrentValues? Что это значит?Может кто-нибудь объяснить этот код MSDN мне на английском?

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

Northwnd db = new Northwnd("..."); 
try 
{ 
    db.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException e) 
{ 
    Console.WriteLine(e.Message); 
    foreach (ObjectChangeConflict occ in db.ChangeConflicts) 
    { 
     // All database values overwrite current values. 
     occ.Resolve(RefreshMode.OverwriteCurrentValues); 
    } 
} 

ответ

9

Я добавил некоторые комментарии к коду, увидеть, если это помогает:

Northwnd db = new Northwnd("..."); 
try 
{ 
    // here we attempt to submit changes for the database 
    // The ContinueOnConflict specifies that all updates to the 
    // database should be tried, and that concurrency conflicts 
    // should be accumulated and returned at the end of the process. 
    db.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 

catch (ChangeConflictException e) 
{ 
    // we got a change conflict, so we need to process it 
    Console.WriteLine(e.Message); 

    // There may be many change conflicts (if multiple DB tables were 
    // affected, for example), so we need to loop over each 
    // conflict and resolve it. 
    foreach (ObjectChangeConflict occ in db.ChangeConflicts) 
    { 
     // To resolve each conflict, we call 
     // ObjectChangeConflict.Resolve, and we pass in OverWriteCurrentValues 
     // so that the current values will be overwritten with the values 
     // from the database 
     occ.Resolve(RefreshMode.OverwriteCurrentValues); 
    } 
} 
0

Я думаю, что это означает, что, если он обнаруживает конфликт, см this под вычислительной науки, то она переходит в улове. Внутри он проходит через каждый из конфликтов (цикл foreach) и сбрасывает значения до того, что они были до того, как произошло изменение.

0

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

0

Конфликт propabely вызвано тем, что объект в вашем DataContext (объект, который хранит и сохраняет изменения и т.д. в .net code) имеет другие значения, чем те, которые указаны в вашем db.

Предположим, вы загрузили объект человека из базы данных. Одно из полей - имя, первое имя - S oo. Теперь у вас есть копия вашей записи в datacontext. Вы меняете некоторые вещи и хотите записать изменения в db, но когда (LINQ? Other orm) хочет записать изменения в БД, он замечает, что первое имя в БД уже изменено.

Итак, кто-то изменил вашу запись, у вас есть «тупик» (правильный термин?), Тогда вы должны определить, что более важно, ваши изменения или изменения, которые что-то сделал.

К ТОЧКЕ !!! -> Refreshmode.overwirteCurrentValues ​​Просто обновляет объект в вашем datacontext, он RELOADS объект из db, так что вы работаете с обновленным объектом.

Я надеюсь, что это было немного понятно :)

grtz

1

Во-первых, вы должны понимать, что LinqToSql отслеживает два состояния для каждой строки базы данных. Исходное состояние и текущее состояние. Исходное состояние - это то, что думает datacontext в базе данных. Текущее состояние имеет свои модификации в памяти.

Во-вторых, LinqToSql использует оптимистичный параллелизм для выполнения обновлений. Когда вызывается функция SubmitChanges, datacontext отправляет исходное состояние (как фильтр) вместе с текущим состоянием в базу данных. Если записи не изменяются (поскольку запись базы данных больше не соответствует исходному состоянию), возникает исключение ChangeConflictException.

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

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