2013-05-24 3 views
2

У меня есть счетчик в SQL, который нужно спускать каждый раз, когда пользователь выполняет операцию. Время от времени активность быстрая и яростная, и я получаю исключение ChangeConflictException. Это прекрасно, но когда это произойдет, я хотел бы, чтобы конечное значение представляло собой комбинацию обоих изменений.Устранение MemberChangeConflict с определенным значением

Нечто подобное

try 
{ 
    db.SubmitChanges(); 
} 
catch (ChangeConflictException cce) 
{ 
    foreach (ObjectChangeConflict occ in db.ChangeConflicts) 
    { 
     foreach (MemberChangeConflict mcc in occ.MemberConflicts) 
     { 
      if (mcc.DatabaseValue is int) 
      { 
       mcc.FinalValue = mcc.DatabaseValue + mcc.CurrentValue - mcc.OriginalValue; 
      } 
     } 
    } 
} 

значений выборок, исходное значение равно 50, текущее значение 30 (меньше 20), и значение базы данных 40 (менее 10 от оригинала). Конечное значение должно быть 40-20 = 20.

За исключением, конечно, нет такой вещи, как mcc.FinalValue. Как мне это сделать?

ответ

0

Используйте метод MemberChangeConflict.Resolve.

mcc.Resolve(mcc.DatabaseValue + mcc.CurrentValue - mcc.OriginalValue); 

(И не забудьте позвонить SubmitChanges снова после того как вы проходным ваших конфликтов.)

+0

Хм, если я снова вызову SubmitChanges, ошибка может повториться, нет? – tofutim

+0

Вы всегда можете окружать свои заявления try/catch циклом, который вышел из успешной подачи. –

1

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

Решение проблемы будет заключаться в использовании транзакции для первого чтения данных и последующего внесения изменений.

См. Этот вопрос переполнения стека для примера транзакций.

How to create a LINQ to SQL Transaction?

+0

Похоже Linq к SQL уже завернутые в рамках сделки (в нижней части), хотя я не уверен, что это, если мне нужно вытащить данные, чтобы проверить, что это не null. – tofutim

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