Почему мой CONTEXT_INFO () пуст? - PullRequest
7 голосов
/ 20 февраля 2010

У меня есть метод, который устанавливает мой контекст данных linq.Прежде чем вернуть контроллер домена, он вызывает сохраненный процесс, который устанавливает значение CONTEXT_INFO для идентификации текущего пользователя.

Триггер фиксирует все внесенные изменения, и с использованием этих данных контекста записывает запись аудита.* Я заметил, что мои данные контекста были пустыми в таблице аудита, поэтому я написал простой модульный тест, чтобы пройти через этот процесс, и все равно ничего не получил.Однако, если я вставлю все операторы Linq-To-SQL в окно запроса, данные контекста будут там.

При просмотре трассировки профилировщика в этом процессе выполняется довольно много вызовов sp_reset_connection.Я понял, что это не должно влиять на значение CONTEXT_INFO.

Так что же здесь происходит?

Ответы [ 2 ]

9 голосов
/ 20 февраля 2010

Linq to SQL DataContext на самом деле не удерживает соединение открытым, когда вы выполняете запросы, используя понимание запросов или ExecuteQuery / ExecuteMethod вызов, и CONTEXT_INFO живет только в контексте одного соединения.

Чтобы это работало, вам нужно вручную открыть соединение на DataContext с помощью context.Connection.Open() перед установкой context_info. Как только соединение уже открыто, последующие запросы не будут автоматически закрывать соединение, когда они завершены.

Примечание. Техническая причина этого заключается в том, что он вызывает ExecuteReader для IDbCommand с набором CommandBehavior.CloseConnection, если только соединение не было открыто. Вы можете сами увидеть то же поведение, если используете SqlCommand / IDbCommand объекты с одинаковым установленным флагом.

Редактировать. Думаю, мне следует также указать, что если соединение объединено в пул, технически физическое соединение все время "открыто", но IDbConnection все еще закрывается, что и приводит к сбросу соединения. 1019 *

3 голосов
/ 20 февраля 2010

sp_reset_connection сбрасывает context_info.Процедура sp_reset_connection - это процедура, вызываемая пулами клиентских приложений при перезапуске соединения, поэтому кажется, что вы видите контекст для одного соединения, закрываете соединение и ожидаете, что контекст будет установлен для нового соединения, что явно ошибочно.

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