Как отменить ChangeSet в LINQtoSQL - PullRequest
4 голосов
/ 19 января 2009

в своем классе слоя данных я создал функцию для ручного обновления источника данных.

Public Sub DiscardAllChanges()

    _Context.Refresh(RefreshMode.OverwriteCurrentValues)

End Sub

Проблема в том, что контекст ChangeSet после этой операции все еще отслеживает предыдущую операцию вставки, удаления и обновления, которую я сделал, вызывая вручную InsertOnSubmit и т. Д.

Можно ли как-то очистить ChangeSet? Или, если нет, можете ли вы предложить мне другое решение? Нужно ли создавать слой ChangeSet в Business?

Ответы [ 3 ]

5 голосов
/ 19 января 2009

Самый простой способ справиться с этим - считать DataContext своей единицей работы. Выполните атомарный набор связанных операций над одним DataContext, затем, в случае успеха или неудачи, Dispose() его (в идеале через using) и выбросьте.

Запустите следующий набор операций на новом DataContext. Кроме того, вы можете повторно запросить данные.

Для каждого объекта вы можете использовать GetOriginalEntityState (для таблицы), чтобы получить исходные значения, но вам нужно будет повторно применить к «живому» объекту, а это не так обрабатывать случаи удаления / вставки.

1 голос
/ 19 января 2009

Похоже, вы пытаетесь справиться с проблемами параллелизма? Именно здесь, когда вы отправляете, база данных уже изменилась, что приводит к сбою отправки. Дайте мне знать, если это то, что вы после:

DataClasses1DataContext dc = new DataClasses1DataContext();
try
{
    dc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
}
catch (System.Data.Linq.ChangeConflictException ex)
{
    foreach (var conflict in dc.ChangeConflicts)
    {
        conflict.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
    }
    dc.SubmitChanges();
}

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

0 голосов
/ 10 декабря 2009

dc.Refresh (System.Data.Linq.RefreshMode.OverwriteCurrentValues, item);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...