Как установить аритаборт для соединений в LINQ с SQL

StackOverflow https://stackoverflow.com/questions/2970488

  •  24-10-2019
  •  | 
  •  

Вопрос

По умолчанию опция подключения SQL Arithabort выключен для соединений OLEDB, которые, как я полагаю, использует LINQ с SQL. Однако мне это нужно, чтобы быть включенным. Причина в том, что мой БД содержит некоторые индексированные представления, и любые операции вставки/обновления/удаления против таблиц, которые являются частью индексированного представления, сбой, если соединение не включает аритаборт. Даже выберет против самого индексированного представления, если используется подсказка с (noexpand) (который вы должны использовать в SQL Standard Edition, чтобы получить выгоду от производительности индексированного представления).

Есть ли где -то в контексте данных, я могу указать, что хочу эту опцию? Или где -то в коде я могу это сделать ??

Я справился с неуклюжим обходным пути, но мне это не нравится .... Я должен создать хранимую процедуру для каждой операции Select/INSERT/UPDATE/DELETE, и в этом PROC сначала запустите Arithabort, затем выполните другой который содержит фактический SELECT/INSERT/UPDATE/DELETE. Другими словами, первый Proc - просто обертка для второго. Это не работает, чтобы просто установить SET ARITHABORT выше кода SELECT/INSERT/UPDATE/DELETE.

Это было полезно?

Решение

То, что я в итоге сделал, это написал свой собственный метод в своем собственном классе «помощника», чтобы создать DataContext и использование этого каждый раз, когда мне нужен обратный данных, например,

      Dim conn As New SqlConnection(Config.GetConnectionString("SiteSqlServer"))
      Dim command As New SqlCommand("set arithabort on;", conn)
      command.Connection.Open()
      command.ExecuteNonQuery()
      Dim dc = New SiteDataContext(conn)

Идея здесь состоит в том, чтобы использовать конструктор DataContext, который принимает соединение в качестве параметра. Я создаю и открываю SQLConnection, запускаю «Установите аритаборт ...» и передаю его в DC (кредит идет на плакат здесь).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top