Как установить аритаборт для соединений в LINQ с SQL
-
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 (кредит идет на плакат здесь).