2010-02-19 22 views
6

Mam metodę, która ustawia mój kontekst danych linq. Zanim zwróci DC, wywołuje przechowywany proc, który ustawia wartość CONTEXT_INFO, aby zidentyfikować bieżącego użytkownika.Dlaczego moja funkcja CONTEXT_INFO() jest pusta?

Triger wychwytuje wszelkie wprowadzone zmiany, a użycie tego kontekstu powoduje zapis rekordu kontroli.

Zauważyłem, że moje dane kontekstowe były w pustej tabeli kontroli, więc napisałem prosty test jednostkowy, aby przejść przez ten proces i nadal nie otrzymuję nic. Jednak jeśli wkleję wszystkie instrukcje Linq-SQL do okna zapytania, dane kontekstu są dostępne.

Patrząc na ślad profilera, wykonuje on kilka wywołań sp_reset_connection w tym procesie. Zrozumiałem, że nie powinny one mieć wpływu na wartość CONTEXT_INFO.

Co tu się dzieje?

Odpowiedz

8

LINQ to SQL DataContext faktycznie nie posiadają połączenie otwarte podczas wykonywania zapytań, wykorzystując do zrozumienia zapytania lub ExecuteQuery/ExecuteMethod połączenie i CONTEXT_INFO żyje tylko w ramach jednego połączenia.

Aby to zadziałało, należy ręcznie otworzyć połączenie na DataContext, używając context.Connection.Open() przed ustawieniem parametru context_info. Gdy połączenie jest już otwarte, kolejne zapytania nie zamkną automatycznie połączenia po ich zakończeniu.

Uwaga - powodów technicznych jest to, że wywołuje ExecuteReader na IDbCommand z CommandBehavior.CloseConnection zbioru, chyba że połączenie zostało już otwarte. Możesz zobaczyć to samo zachowanie, jeśli używasz obiektów o tym samym zestawie flag.

Edycja - Chyba powinienem również zwrócić uwagę, że jeśli połączenie jest połączone, technicznie fizyczne połączenie jest "otwarte" przez cały czas, ale IDbConnection nadal się zamyka, co powoduje reset połączenia.

+0

To dlatego uwielbiam przepełnienie stosu. Pomogłeś mi uniknąć nieszczęśliwego weekendu. Dzięki, zagłębię się w to. –

3

sp_reset_connection resetuje context_info. sp_reset_connection to procedura wywoływana przez pule aplikacji klienta podczas recyklingu połączenia, więc wygląda na to, że wybieramy kontekst dla jednego połączenia, zamykając połączenie i oczekując, że kontekst zostanie ustawiony na nowym połączeniu, co jest oczywiście błędne.

+0

to wszystko ma sens, teraz tak to ująć, dziękuję –

Powiązane problemy