Исключение при использовании Linq to SQL на сайте.Уже есть открытый ридер данных - PullRequest
0 голосов
/ 06 сентября 2011

На веб-сайте ASP.NET я использую LINQ to SQL для получения данных. Эта операция несколько длинная (может быть до 3 секунд) и часто пользователь нажимает на ссылку второй раз

Уже есть открытый DataReader, связанный с этой командой который должен быть закрыт первым.

Я смотрел на DataReader, уже открытый при использовании LINQ и других подобных тем, но я не понимаю, как с этим справиться / исправить.

Должен ли я вообще избавиться от LINQ to SQL? Как правильно справиться с этим?

EDIT:

Код, который я звоню с Page_Load

using (var wdc = new WebDataContext())
            {
                // Expensive operation, increase timeout
                wdc.CommandTimeout = 120;

                // First need to update data for this customer
                wdc.Web_WrkTrackShipment_Update((int)this.Parent.ProviderUserKey, sessionId);

                // Return set of this data based on parameters.
                return wdc.Web_WrkTrackShipment_Load(sessionId, pageNo, pageSize, searchCriteria, dateFrom, dateTo, ref pageCount_Null).ToList();
            } 

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Это можно исправить, установив Несколько активных наборов результатов (MARS) в значение true в строке подключения. Обратите внимание, что это может указывать на проблему соединения N + 1, это действительно зависит от запроса.

string connectionString = "Data Source=MSSQL1;" + 
    "Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
    "MultipleActiveResultSets=True";
0 голосов
/ 06 сентября 2011

Я подозреваю, что причина в том, что DataContext не является поточно-ориентированным. Различные запросы выполняются в разных потоках.

Не делитесь своим DataContext между потоками. Либо начните один в BeginRequest и закройте его в EndRequest - либо создайте его локально, когда вам это нужно, и оберните его в оператор using, чтобы он сразу же удалялся, когда ваш код закончил его использовать.

...