MultipleActiveResultSets vs Multiple 'using()' state
本文关键字:state using MultipleActiveResultSets vs Multiple | 更新日期: 2023-09-27 17:56:17
在我的控制器中,我尝试使用foreach
循环外部定义的上下文从foreach
循环中的数据表中检索数据,但收到错误,指出 DataReader 已在使用中。在Stackoverflow上搜索后,我发现了一篇关于将MultipleActiveResultSets=true;
添加到我的Web.config的帖子。 这奏效了。
我还阅读了有关将调用包装在实现 using()
函数的新上下文中以在调用后释放上下文的信息,因此每次通过 foreach 循环都会创建然后释放上下文。
这是带有 using 语句的代码
using (var _billingContext = new ContextModel())
{
var casebilling = _billingContext.Billings.Where(b => b.CaseId == currentcase.Id).ToList();
casetoadd.Billings = casebilling;
}
是否有一种或另一种优势?
编辑以显示原始代码:
foreach (var currentcase in clientcases)
{
var billing = new List<Billing>();
var casetoadd = new CaseViewModel();
var casebilling = _Context.Billings.Where(b => b.CaseId == currentcase.Id).ToList();
casetoadd.Billings = casebilling;
casetoadd.Id = currentcase.Id;
casetoadd.CaseNumber = currentcase.CaseNumber;
clientCases.Add(casetoadd);
}
这就是给我错误的原因
MultipleActiveResultSets允许应用程序在每个连接上有多个挂起的请求。在您的情况下,这不是错误的原因,实际上使用它而不将上下文包装在 using 语句中会导致 SQL 继续为同一请求打开连接(不好的做法)。您的问题是(我假设是因为您尚未发布原始代码)您正在使用带有延迟加载(默认)的 LINQ,并且在您的调用中您没有调用".ToList"方法,执行SQL调用,它将为您提供数据的内存列表,您可以自由循环访问该列表,而无需返回数据库。旁注 using 语句只是释放上下文的最佳做法,但当应用程序进行垃圾回收时,上下文将调用 dispose 不是必需的。