2010-02-19 16 views
6

Ich habe eine Methode, die meinen Linq-Datenkontext einrichtet. Bevor es den DC zurückgibt, ruft es einen gespeicherten Prozess auf, der den CONTEXT_INFO-Wert einrichtet, um den aktuellen Benutzer zu identifizieren.Warum ist CONTEXT_INFO() leer?

Ein Trigger nimmt alle vorgenommenen Änderungen auf und schreibt mit diesen Kontextdaten einen Audit-Datensatz.

Ich bemerkte, dass meine Kontextdaten in der Audit-Tabelle leer waren, so schrieb ich einen einfachen Komponententest, um durch diesen Prozess zu gehen, und ich bekomme immer noch nichts. Wenn ich jedoch alle Linq-To-SQL-Anweisungen in ein Abfragefenster einfüge, sind die Kontextdaten vorhanden.

Wenn Sie einen Profiler-Trace betrachten, werden in diesem Prozess einige sp_reset_connection-Aufrufe ausgeführt. Ich hatte verstanden, dass diese keinen Einfluss auf den CONTEXT_INFO Wert haben sollten.

Also, was ist hier los?

Antwort

8

A Linq DataContext to SQL die Verbindung offen nicht wirklich halten, wenn Sie Abfragen ausführen, entweder Abfrage-Verwendung oder ExecuteQuery/ExecuteMethod Anruf und CONTEXT_INFO lebt nur im Zusammenhang mit einer einzigen Verbindung.

Damit dies funktioniert, müssen Sie die Verbindung unter DataContext manuell mit context.Connection.Open() öffnen, bevor Sie context_info setzen. Sobald die Verbindung bereits geöffnet ist, wird die Verbindung bei nachfolgenden Abfragen nicht automatisch geschlossen, wenn sie beendet sind.

Hinweis - Der technische Grund dafür ist, dass ExecuteReader auf dem IDbCommand mit CommandBehavior.CloseConnection gesetzt wird, es sei denn, die Verbindung war bereits offen. Sie können dasselbe Verhalten selbst sehen, wenn Sie SqlCommand/IDbCommand Objekte mit demselben Flagsatz verwenden.

Edit - Ich denke, ich sollte auch darauf hinweisen, dass, wenn die Verbindung gepoolt wird, technisch die physische Verbindung ist "offen" die ganze Zeit, aber die IDbConnection wird immer noch geschlossen, was die Verbindung zurückgesetzt wird.

+0

Deshalb liebe ich Stapelüberlauf. Du hast mir gerade geholfen, ein miserables Wochenende zu vermeiden. Danke, ich werde mich darum kümmern. –

3

sp_reset_connection setzt context_info zurück. sp_reset_connection ist die Prozedur, die von den Client-App-Pools beim Zurückführen einer Verbindung aufgerufen wird. Es scheint also, dass Sie den Kontext für eine Verbindung auswählen, die Verbindung schließen und erwarten, dass der Kontext für eine neue Verbindung festgelegt wird, die offensichtlich fehlerhaft ist.

+0

es macht alles so viel Sinn, jetzt stellst du es so, danke –