LINQ to SQL - как хранимые процедуры взаимодействуют с неотправленными изменениями контекста данных?

Кто-то здесь спросил:

«Linq-To-Sql позволяет вызывать SP. Если этот SP выполняет обновление / удаление / вставку, мне нужно после него SubmitChanges ()?»

И ответ был такой:

«Нет. Код будет работать. Отправка изменений касается только измененных объектов LINQ to SQL, а не сохраненных процедур».

Хочу лишь уточнить:

(Извините, я относительно новичок в LINQ)

Да, но не будет ли хранимая процедура обходить объект datacontext и изменять саму базу данных? (тогда как linq изменяет только объект datacontext, пока не будет вызван метод datacontext.submitchanges, где он затем изменяет базу данных)

Могу ли я каким-то образом изменить мой объект datacontext с помощью хранимой процедуры? Он уже делает это?

Можно мне так, чтобы

  • если я вызываю SP с помощью linq (и я предполагаю, что он напрямую изменяет базу данных),
  • затем используйте linq для изменения моего объекта datacontext и отправьте изменения, которые я внес в свой объект datacontext,

два разных изменения, которые я сделал (одно с SP, другое с Linq в моем тексте данных), не будут мешать?

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

Я должен упомянуть, что я конвертирую веб-сайт из SQL в LINQ, который в основном содержит хранимые процедуры, и пытаюсь выбрать, какие хранимые процедуры преобразовать в LINQ, а какие оставить в SQL, и просто сделать SP-вызовы для них с помощью LINQ.

Спасибо за помощь, Джефф


person Jeff R    schedule 06.08.2010    source источник


Ответы (2)


FWIW, наша лакмусовая бумажка - это любой тривиальный PROC типа 'crud', который вставляет / обновляет одну запись, может перемещаться в ORM

Однако мы, как правило, оставляем более продвинутые процедуры (пакетные обновления или высокопроизводительные) «как есть».

Но да, вам нужно будет вызвать SubmitChanges () перед вызовом Proc, который зависит от состояния данных, измененных в DataContext.

Возможно, не связанное с этим, если вам нужно контролировать единицы работы, посмотрите, как разместить TransactionScopes в своем коде?

person StuartLC    schedule 06.08.2010
comment
если вам нужно контролировать единицы работы, посмотрите, как поставить TransactionScopes. Или просто откройте соединение вручную, запустите в нем транзакцию и предоставьте это соединение одному из конструкторов DataContext. - person Steven; 06.08.2010

Если вы обновляете записи через хранимую процедуру, ваши загруженные (и отслеживаемые) объекты могут стать устаревшими. Если вы вызовете SubmitChanges с устаревшими объектами, вы получите исключения параллелизма. Вы можете обновить устаревший объект, используя метод Refresh на DataContext.

person Amy B    schedule 06.08.2010