2010-03-01 2 views
4

Мы используем запросы, сгенерированные Linq для извлечения данных, но для INSERT и UPDATE мы не разрешаем сгенерированный SQL, а ограничиваем использование хранимых процедур.Linq2SQL с использованием Update StoredProcedure

Я подключил поведение Update и Insert в DBML к хранимым процедурам. Вызывается процедуры, данные вставляются/обновляются = все, если они указаны, , за исключением оптимистического параллелизма.

Если запись была изменена между поиском и обновлением, обновление должно завершиться ошибкой.

Когда Linq генерирует оператор Update сам, он бросает ChangeConflictException, как ожидалось, но с использованием хранимой процедуры не исключение не выкинули.

Большое спасибо за помощь!

ответ

3

При настройке поведения UPDATE для использования хранимой процедуры обновления Linq2SQL генерирует метод, который равен , не отбрасывая параллелизм исключений. Чтобы справиться с оптимистической конкурентности I found a proposed solution in the MSDN forums

Вы можете реализовать метод Update самостоятельно в patial классе DataContext и бросить ChangeConflictException.

Для достижения этой цели необходимо:

  • написать хранимую процедуру обновления, которая принимает текущие и исходные значения в качестве параметров
    • использованием WHERE columnA = OriginalValueA ... для обновления только тогда, когда значения не были изменены
    • последняя строка в хранимой процедуре равна RETURN @@ROWCOUNT
    • номер строки позволяет увидеть, была ли строка обновлена ​​или нет
  • в DBML установить поведение Update «использовать во время выполнения»
  • частичный класс xxxDataContext реализовать метод Update как это:
    • код берется из того, что Linq2SQL генерирует, только последняя линия бросать исключение добавляется
partial void UpdateYourEntityClass(YourEntityClass obj) 
     { 
      EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj))); 
      int result = this.YourEntityClassUpdate((...)); 
      if (result == 0) throw new ChangeConflictException(); 
     } 

Рабочие, но не прямые. Любые другие варианты?

0

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

Это одна из причин, по которой мы не используем хранимые процедуры без использования L2S-back-end при выполнении вставок/обновлений/удалений. Другим недостатком использования хранимых процедур является то, что вы теряете сильную проверку типов в своих инструкциях insert/update/delete.

+0

Спасибо! Дизайнер DBML позволяет сопоставлять поведение INSERT, UPDATE и DELETE с хранимыми процедурами. А также позволяет сопоставлять исходные значения с параметрами хранимой процедуры обновления. Единственным недостающим элементом является проверка строки и сброс исключения ChangeConflictException. Его все там, кроме сгенерированного кода в Designer.cs, не генерирует исключение. – PeterFromCologne

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