Может ли кто-нибудь объяснить мне этот код MSDN на английском? - PullRequest
4 голосов
/ 22 июля 2010

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

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);
    }
}

Ответы [ 5 ]

9 голосов
/ 22 июля 2010

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

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);
    }
}
1 голос
/ 22 июля 2010

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

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

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

0 голосов
/ 22 июля 2010

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

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

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

К ТОЧКЕ !!!-> Refreshmode.overwirteCurrentValues ​​Просто обновляет объект в текстовом тексте данных, он перезагружает объект из базы данных, чтобы вы работали с обновленным объектом.

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

grtz

0 голосов
/ 22 июля 2010

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

0 голосов
/ 22 июля 2010

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

...