Linq2SQL, используя обновление StoredProcedure - PullRequest
4 голосов
/ 01 марта 2010

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

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

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

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

Большое спасибо за любую помощь в этом!

Ответы [ 2 ]

3 голосов
/ 16 марта 2010

При настройке поведения UPDATE для использования хранимой процедуры обновления Linq2SQL генерирует метод, который не вызывает исключений параллелизма . Для обработки оптимистичного параллелизма я нашел предлагаемое решение на форумах MSDN

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

Для этого вам необходимо:

  • написать хранимую процедуру обновления, которая принимает текущие и исходные значения в качестве параметров
    • с использованием WHERE columnA = OriginalValueA ... для обновления, только если значения не были изменены
    • последняя строка хранимой процедуры - RETURN @@ROWCOUNT
    • счетчик строк позволяет увидеть, была ли строка обновлена ​​или нет
  • в DBML задайте поведение обновления как «использовать среду выполнения»
  • частичный класс 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 голосов
/ 01 марта 2010

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

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

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