Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MultipleActiveResultSets vs Multiple';使用();声明_C#_Dbcontext_Datareader - Fatal编程技术网

C# MultipleActiveResultSets vs Multiple';使用();声明

C# MultipleActiveResultSets vs Multiple';使用();声明,c#,dbcontext,datareader,C#,Dbcontext,Datareader,在我的控制器中,我尝试使用foreach循环外部定义的上下文从foreach循环内的datatable检索数据,但收到错误,指出DataReader已在使用。在这里搜索Stackoverflow之后,我发现了一篇关于添加MultipleActiveResultSets=true到my Web.config。成功了 我还阅读了关于在新上下文中包装调用的内容,实现了using()函数来在调用后处理上下文,因此每次通过foreach循环都会创建并处理上下文 这是带有using语句的代码 using (

在我的控制器中,我尝试使用
foreach
循环外部定义的上下文从
foreach
循环内的datatable检索数据,但收到错误,指出DataReader已在使用。在这里搜索Stackoverflow之后,我发现了一篇关于添加
MultipleActiveResultSets=true到my 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);
}
foreach(clientcases中的var currentcase)
{
var计费=新列表();
var casetoadd=新的CaseViewModel();
var casebilling=_Context.Billings.Where(b=>b.CaseId==currentcase.Id.ToList();
案例添加账单=案例账单;
casetoadd.Id=当前case.Id;
casetoadd.CaseNumber=当前Case.CaseNumber;
clientCases.Add(casetoadd);
}

这就是导致错误的原因

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