Linq to Sql: исключение ChangeConflictException (и строки не обновляются / удаляются) - PullRequest
1 голос
/ 30 декабря 2010

Я пытаюсь приспособить Linq к Sql в дизайн N-уровня.Я реализую параллелизм, предоставляя оригинальные значения при присоединении объектов к контексту данных.При вызове SubmitChanges и просмотре сгенерированных скриптов на профилировщике сервера sql я вижу, что они генерируются правильно.Они включают в себя предложения where, которые проверяют все свойства объекта (все они помечены UpdateCheck.Always).

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

Для ясности приведу схему и последовательность выполнения тестов, которые я выполняю: у меня есть консоль клиента и консоль службы, которые общаются друг с другом через WCF с использованием WsHttpBinding.

  1. Клиент запрашивает данные у службы
  2. Служба создает экземпляр текста данных, извлекает данные, удаляет контекст, возвращает данные клиенту.
  3. Клиент вносит изменения в возвращаемые данные.
  4. Клиент запрашивает обновление измененных данных у службы.
    5a.Служба создает текстовый текст, присоединяет объекты и ...
    5b.Я приостанавливаю выполнение и изменяю значения в базе данных, чтобы вызвать конфликт изменений
    5c.Сервис звонков SubmitChanges.

Вот код для шага 5, немного очищенный для ясности:

public void UpdateEntities(ReadOnlyChangeSet<Entity> changeSet)
        {
            using (EntityDataContext context = new EntityDataContext())
            {
                if (changeSet.AddedEntities.Count > 0)
                {
                    context.Entities.InsertAllOnSubmit(changeSet.AddedEntities);
                }

                if (changeSet.RemovedEntities.Count > 0)
                {
                    context.Entities.AttachAll(changeSet.RemovedEntities, false);
                    context.Entities.DeleteAllOnSubmit(changeSet.RemovedEntities);
                }

                if (changeSet.ModifiedRecords.Count > 0)
                {
                    foreach (var record in changeSet.ModifiedRecords)
                    {
                        context.Entities.Attach(record.Current, record.Original);
                    }
                }

                // This is where I pause execution and make changes to the database

                context.SubmitChanges();
            }
        }

Я использую некоторые классы для отслеживания изменений и сохранения оригиналов, как вы можете видеть.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: У меня нет проблем со вставками.Я только включил код, который вызывает InsertAllOnSubmit для полноты.

1 Ответ

0 голосов
/ 30 декабря 2010

Итак, я нашел ответ.Кажется, это ошибка в Linq To Sql (поправьте меня, если я ошибаюсь).Оказывается, что таблица, обновляемая в базе данных, имеет триггер.Этот триггер вызывает хранимую процедуру, которая имеет возвращаемое значение.Это вызывает вызовы для вставки, обновления или удаления этой таблицы, чтобы получить возвращаемое значение (из хранимой процедуры, запускаемой триггером), которое НЕ является числом строк, но является числом.Очевидно, L2S видит это число и предполагает, что все прошло хорошо, даже если на самом деле вставки / обновления / удаления не произошло.

Это довольно странно, особенно учитывая, что возвращаемое число имеет определенное имя столбца и его значение находится вцифровая область.

...