2010-02-19 53 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