2010-12-30 4 views
1

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

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

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

  1. Клиент запрашивает данные от службы
  2. Service инстанцирует DataContext, извлекает данные, избавляется контекст, возвращает данные клиенту.
  3. Клиент вносит изменения в возвращаемые данные.
  4. Клиент запрашивает обновление измененных данных из службы.
    5a. Служба создает экземпляр datacontext, прикрепляет объекты и ...
    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(); 
      } 
     } 

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

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

EDIT: У меня нет проблем со вставками. Я только включил код, который вызывает InsertAllOnSubmit для полноты.

ответ

0

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

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

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

  • Нет связанных вопросов^_^