2010-02-19 44 views
6

我有一个方法来设置我的linq数据上下文。在它返回DC之前,它会调用一个存储过程来设置CONTEXT_INFO值来标识当前用户。为什么我的CONTEXT_INFO()为空?

触发器会检测所做的任何更改,并使用此上下文数据写入审计记录。

我注意到,我的上下文数据在审计表空白,所以我写了一个简单的单元测试来逐步通过这个过程,我什么都没有。但是,如果我将所有Linq-To-SQL语句粘贴到查询窗口中,则上下文数据就在那里。

看一下探查器跟踪,在这个过程中会调用很多sp_reset_connection调用。我了解到这些不应该对CONTEXT_INFO值产生影响。

那么这里发生了什么?

回答

8

一个LINQ to SQL的DataContext并不实际持有的连接打开,当你执行查询,或者使用查询综合或ExecuteQuery/ExecuteMethod号召,CONTEXT_INFO只住在一个单一连接的情况下。

为了使其正常工作,您需要在设置context_info之前使用context.Connection.Open()手动打开DataContext上的连接。一旦连接已经打开,连续查询在连接完成后不会自动关闭连接。

注 - 其技术原因是它调用ExecuteReaderIDbCommandCommandBehavior.CloseConnection设置,除非连接已经打开。如果您使用具有相同标志集的对象SqlCommand/IDbCommand,则可以自己查看相同的行为。

编辑 - 我想我也应该指出,如果连接汇集,技术上物理连接是“开放”的整个时间,但IDbConnection仍然是关闭,这是导致连接重置的原因。

+0

这就是为什么我爱堆栈溢出。你刚刚帮我避开了一个悲惨的周末。谢谢,我会研究它。 – 2010-02-19 21:32:32

3

sp_reset_connection会重置context_info。 sp_reset_connection是在回收连接时由客户端应用程序池调用的过程,因此您似乎在一个连接上分配上下文,关闭连接并期望在新连接上设置上下文,这显然是错误的。

+0

现在你把它说得这么有意义,谢谢 – 2010-02-19 21:34:05