2010-02-19 15 views
6

Tengo un método que configura mi contexto de datos linq. Antes de devolver el DC, llama a un proceso almacenado que configura el valor CONTEXT_INFO para identificar al usuario actual.¿Por qué mi CONTEXT_INFO() está vacío?

Un disparador detecta cualquier cambio realizado y utilizando este contexto escribe un registro de auditoría.

Noté que mis datos de contexto estaban en la tabla de auditoría en blanco, así que escribí una prueba de unidad simple para seguir este proceso y todavía no recibo nada. Sin embargo, si pego todas las sentencias de Linq-To-SQL en una ventana de consulta, los datos de contexto están allí.

En cuanto a la traza del perfilador, realiza bastantes llamadas sp_reset_connection en este proceso. Había entendido que estos no deberían tener un efecto sobre el valor CONTEXT_INFO.

¿Qué está pasando aquí?

Respuesta

8

Un LINQ to SQL DataContext en realidad no tener la conexión abierta al ejecutar consultas, ya sea mediante la comprensión de consulta o ExecuteQuery/ExecuteMethod llamada y CONTEXT_INFO sólo vive en el contexto de una única conexión.

Para que esto funcione, debe abrir manualmente la conexión en el DataContext usando context.Connection.Open() antes de configurar context_info. Una vez que la conexión ya está abierta, las consultas sucesivas no cerrarán automáticamente la conexión cuando terminen.

Nota: la razón técnica para esto es que invoca ExecuteReader en el IDbCommand con CommandBehavior.CloseConnection conjunto, a menos que la conexión ya estuviera abierta. Puede ver el mismo comportamiento usted mismo si usa objetos SqlCommand/IDbCommand con el mismo conjunto de banderas.

Edición - Supongo que también debo señalar que si la conexión se combina, técnicamente la conexión física está "abierta" todo el tiempo, pero el IDbConnection todavía se está cerrando, que es lo que hace que se restablezca la conexión.

+0

Es por eso que amo el desbordamiento de pila. Me acabas de ayudar a evitar un fin de semana miserable. Gracias, lo investigaré. –

3

sp_reset_connection restablece context_info. sp_reset_connection es el procedimiento invocado por los grupos de aplicaciones del cliente al reciclar una conexión, por lo que parece que se está buscando el contexto en una conexión, cerrando la conexión y esperando que el contexto se establezca en una nueva conexión, lo cual es obviamente erróneo.

+0

todo tiene mucho sentido ahora que lo pones así, gracias –

Cuestiones relacionadas