在ASP.NET网站上,我使用LINQ to SQL来获取数据。此操作有点长(最长可达3秒),并且通常是用户第二次点击链接
已经有一个与此命令关联的开放DataReader 必须先关闭。
我查看了DataReader already open when using LINQ和其他类似的帖子,但我不明白如何处理/修复此问题。
我应该完全摆脱LINQ to SQL吗?处理这个问题的正确方法是什么?
修改
我从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();
}
答案 0 :(得分:0)
我怀疑,其根本原因是DataContext不是线程安全的。不同的请求在不同的线程上运行。
不要在线程之间共享DataContext。在BeginRequest上启动一个并在EndRequest上关闭它 - 或者在需要时在本地创建一个,并将其包装在using
语句中,以便在代码使用完毕后立即处理它。
答案 1 :(得分:0)
您可以通过在连接字符串中将Multiple Active Result Sets(MARS)设置为true来解决此问题。请注意,这可能表示N + 1连接问题,它实际上取决于查询。
string connectionString = "Data Source=MSSQL1;" +
"Initial Catalog=AdventureWorks;Integrated Security=SSPI" +
"MultipleActiveResultSets=True";