我有一个设置linq数据上下文的方法。在它返回DC之前,它调用存储过程来设置CONTEXT_INFO值以识别当前用户。
触发器会获取所做的任何更改,并使用此上下文数据写入审核记录。
我注意到我的上下文数据在审计表空白处,所以我写了一个简单的单元测试来逐步完成这个过程,我仍然得不到任何结果。但是,如果我将所有Linq-To-SQL语句粘贴到查询窗口中,那么上下文数据就在那里。
查看分析器跟踪,它在此过程中进行了大量的sp_reset_connection调用。我已经明白这些不应该对CONTEXT_INFO值产生影响。
那么这里发生了什么?
答案 0 :(得分:9)
Linq to SQL DataContext
在执行查询时实际上不会打开连接,使用查询理解或ExecuteQuery
/ ExecuteMethod
调用,而CONTEXT_INFO
只能生命在单一连接的背景下。
为了使其正常工作,您需要在设置context_info之前使用DataContext
在context.Connection.Open()
上手动打开连接。连接已经打开后,连续查询将不会在连接完成后自动关闭。
注意 - 技术原因是它会在ExecuteReader
设置IDbCommand
时调用CommandBehavior.CloseConnection
,除非连接已经打开。如果您使用具有相同标志集的SqlCommand
/ IDbCommand
个对象,则可以自己查看相同的行为。
编辑 - 我想我还应该指出,如果连接是池,从技术上讲,物理连接一直是“打开”,但IDbConnection
仍然关闭,这是导致连接重置的原因
答案 1 :(得分:3)
sp_reset_connection会重置context_info。 sp_reset_connection是回收连接时客户端应用程序池调用的过程,因此您似乎在一个连接上发布上下文,关闭连接并期望在新连接上设置上下文,这显然是错误的。 / p>