2010-02-19 18 views
6

Ho un metodo che imposta il mio contesto dati linq. Prima di restituire DC, chiama un proc memorizzato che imposta il valore CONTEXT_INFO per identificare l'utente corrente.Perché il mio CONTEXT_INFO() è vuoto?

Un trigger prende tutte le modifiche apportate e utilizzando questo contesto dati scrive un record di controllo.

Ho notato che i miei dati di contesto erano nella tabella di controllo in bianco, quindi ho scritto un semplice test unitario per passare attraverso questo processo e non ho ancora ottenuto nulla. Tuttavia, se si incollano tutte le istruzioni Linq-To-SQL in una finestra di interrogazione, i dati di contesto sono presenti.

Osservando una traccia di profiler, vengono eseguite alcune chiamate sp_reset_connection in questo processo. Avevo capito che questi non dovrebbero avere un effetto sul valore CONTEXT_INFO però.

Quindi cosa sta succedendo qui?

risposta

8

Un LINQ to SQL DataContext in realtà non tenere la connessione aperta quando si esegue query, sia utilizzando la comprensione di query o ExecuteQuery/ExecuteMethod chiamata e CONTEXT_INFO vive solo nel contesto di una singola connessione.

Per far funzionare tutto questo, è necessario aprire manualmente la connessione su DataContext utilizzando context.Connection.Open() prima di impostare context_info. Una volta che la connessione è già aperta, le query successive non chiuderanno automaticamente la connessione al termine.

Nota: la ragione tecnica per questo è che invoca ExecuteReader su IDbCommand con CommandBehavior.CloseConnection impostato, a meno che la connessione fosse già aperta. Puoi vedere lo stesso comportamento tu stesso se usi gli oggetti SqlCommand/IDbCommand con lo stesso gruppo di flag.

Edit - Credo che dovrei anche sottolineare che se la connessione è riunito, tecnicamente la connessione fisica è tutto il tempo "aperto", ma il IDbConnection ancora sta ottenendo chiuso, che è ciò che provoca il ripristino di connessione.

+0

Questo è il motivo per cui adoro lo stack overflow. Mi hai appena aiutato a evitare un weekend miserabile. Grazie, ci penserò. –

3

sp_reset_connection reimposta context_info. sp_reset_connection è la procedura richiamata dai pool di app del client quando si ricicla una connessione, quindi sembra che si stia esaminando il contesto su una connessione, chiudendo la connessione e aspettandosi che il contesto sia impostato su una nuova connessione, il che è ovviamente errato.

+0

tutto ha molto senso ora lo metti così, grazie –

Problemi correlati