Я работаю в среде, в которой корпоративное хост-приложение вызывает клиентские приложения с реализованным COM-интерфейсом через ProgID. Это способ, которым программисты хост-приложения позволяют улучшить приложение с помощью плагинов.
Host app <-> COM interface <-> Client app
Клиентское приложение может использовать методы из предоставленного COM-интерфейса.
Одним из таких методов является RunSqlQuery(rawSqlQuery)
. Он имеет возможности полностью взаимодействовать с SQL в рамках зарегистрированного пользователя хост-приложения (на основе типа аутентификации подключения он может быть пользователем Windows или SQL).
Я ищу способ получить текущий контекст соединения, который был запущен из главного приложения и использовать его как соединение для DbContext.
Зачем?
- Я хочу использовать ORM для привязки данных, привязки параметров, смены трекера и т.д.
- Я могу использовать свое собственное явное SQL-соединение для него, но с моим собственным SQL-соединением я не добираюсь до локальных временных таблиц, которые создаются в хост-приложении с самого начала. Хост-приложение сильно полагается на хранимые процедуры, которые, в свою очередь, работают с указанными локальными временными таблицами
- В случае использования явного SQL-соединения (основное соединение с SQL-сервером содержит хост-приложение) мне нужно управлять учетными данными подключения в строке подключения (когда не разрешен смешанный режим проверки подлинности SQL-сервера)
Для ясности, где проблема, что-то подобное хорошо известно в мире CLR SQL:
В SQL CLR UDF есть возможность использовать context connection=true
как строку соединения, например, SqlConnection (подробнее здесь).
В ссылке выше они писали:
Соединение находится в другом сеансе базы данных, чем хранимая процедура или функция, у него могут быть разные параметры SET, он находится в отдельной транзакции, он не видит ваши временные таблицы и т.д.
И в других местах в этой ссылке:
Вероятно, вы хотите, чтобы хранимая процедура или функция выполнялись в контексте этого соединения, а также транзакции, параметры SET и т.д. Это называется контекстным соединением.