7

我有一种方法可以设置我的 linq 数据上下文。在它返回 DC 之前,它会调用一个存储过程来设置 CONTEXT_INFO 值来识别当前用户。

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

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

查看探查器跟踪它会在此过程中进行很多 sp_reset_connection 调用。我知道这些不应该对 CONTEXT_INFO 值产生影响。

那么这里发生了什么?

4

2 回答 2

9

DataContext当您使用查询理解或ExecuteQuery/ExecuteMethod调用执行查询时, Linq to SQL实际上并不保持连接打开,并且CONTEXT_INFO仅存在于单个连接的上下文中。

为了让它工作,你需要在设置 context_info 之前手动打开DataContext连接。context.Connection.Open()一旦连接已经打开,连续查询在完成后不会自动关闭连接。

注意 - 这样做的技术原因是它ExecuteReaderIDbCommandwithCommandBehavior.CloseConnection集上调用,除非连接已经打开。如果您使用具有相同标志集的SqlCommand/对象,您自己可以看到相同的行为。IDbCommand

编辑-我想我还应该指出,如果连接是池化的,从技术上讲,物理连接一直是“打开的”,但IDbConnection仍然关闭,这就是导致连接重置的原因。

于 2010-02-19T21:30:24.467 回答
3

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

于 2010-02-19T21:31:34.397 回答