2010-02-19 3 views
6

J'ai une méthode qui configure mon contexte de données linq. Avant de renvoyer le contrôleur de domaine, il appelle un proc stocké qui définit la valeur CONTEXT_INFO pour identifier l'utilisateur actuel. Un déclencheur récupère toutes les modifications apportées et utilise ces données de contexte pour écrire un enregistrement d'audit.Pourquoi mon CONTEXT_INFO() est-il vide?

J'ai remarqué que mes données de contexte se trouvaient dans la table d'audit en blanc, j'ai donc écrit un test unitaire simple pour passer à travers ce processus et je n'ai toujours rien. Cependant si je colle toutes les instructions Linq-To-SQL dans une fenêtre de requête, les données de contexte sont là.

En regardant une trace du profileur, il effectue un certain nombre d'appels sp_reset_connection dans ce processus. J'avais compris que cela ne devrait pas affecter la valeur de CONTEXT_INFO.

Alors qu'est-ce qui se passe ici?

Répondre

8

A LINQ to SQL DataContext ne tient pas vraiment la connexion ouverte lorsque vous exécutez des requêtes, soit en utilisant la compréhension de la requête ou ExecuteQuery/ExecuteMethod appel et CONTEXT_INFO ne vit que dans le cadre d'une seule connexion.

Pour que cela fonctionne, vous devez ouvrir manuellement la connexion sur le DataContext en utilisant context.Connection.Open() avant de définir l'info-contexte. Une fois que la connexion est déjà ouverte, les requêtes successives ne ferment pas automatiquement la connexion lorsqu'elles sont terminées.

Remarque - la raison technique est qu'il appelle ExecuteReader sur l'ensemble IDbCommand avec CommandBehavior.CloseConnection, sauf si la connexion était déjà ouverte. Vous pouvez voir vous-même le même comportement si vous utilisez des objets SqlCommand/IDbCommand avec le même ensemble d'indicateurs. Edit - Je suppose que je devrais également souligner que si la connexion est groupée, techniquement la connexion physique est "ouverte" tout le temps, mais le IDbConnection est toujours fermé, ce qui provoque la réinitialisation de la connexion.

+0

C'est pourquoi j'adore le débordement de la pile. Vous venez de m'aider à éviter un week-end misérable. Merci, je vais y regarder. –

3

sp_reset_connection réinitialise context_info. sp_reset_connection est la procédure appelée par les pools d'applications clientes lors du recyclage d'une connexion, il apparaît donc que vous êtes en train de masquer le contexte sur une connexion, fermant la connexion et attendant le contexte sur une nouvelle connexion, évidemment erronée.

+0

tout cela fait tellement de sens maintenant que vous le mettez comme ça, merci –

Questions connexes