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 vs Multiple 'using()' state

MultipleActiveResultSets允许应用程序在每个连接上有多个挂起的请求。在您的情况下,这不是错误的原因,实际上使用它而不将上下文包装在 using 语句中会导致 SQL 继续为同一请求打开连接(不好的做法)。您的问题是(我假设是因为您尚未发布原始代码)您正在使用带有延迟加载(默认)的 LINQ,并且在您的调用中您没有调用".ToList"方法,执行SQL调用,它将为您提供数据的内存列表,您可以自由循环访问该列表,而无需返回数据库。旁注 using 语句只是释放上下文的最佳做法,但当应用程序进行垃圾回收时,上下文将调用 dispose 不是必需的。