C#Entity Framework:已经有一个与此Connection关联的开放DataReader,必须先关闭它

tor*_*uga 7 mysql entity-framework-4 c#-4.0 asp.net-mvc-3

我正在研究ASP.NET MVC3应用程序,我在MySQL 5.5中创建了一个数据库,其中包含一个与联系人表具有一对多关系的公司表.

Bedrijf(带导航属性" 联系方式 ")

联系

由于我必须从当前运行的站点接管这个数据库,我基于该数据库生成了一个实体模型,我编写了以下代码来显示公司列表(按状态分组),提到该公司中的联系人数量:

CompanyRepository.cs

...

public IQueryable<Bedrijf> getCompaniesByStatus(int status)
    {
        return entities.Bedrijven.Where(c => c.bedrijf_status == status).OrderBy(c => c.bedrijf_naam);
    }

...
Run Code Online (Sandbox Code Playgroud)

查看调用3个部分视图

@{Html.RenderPartial("ucCompaniesByStatus", Model.newCompanies, (new ViewDataDictionary { { "Titel", "Nieuwe bedrijven" } }));}

<br />

@{Html.RenderPartial("ucCompaniesByStatus", Model.activeCompanies, (new ViewDataDictionary { { "Titel", "Actieve bedrijven" } }));}

<br />

@{Html.RenderPartial("ucCompaniesByStatus", Model.inActiveCompanies, (new ViewDataDictionary { { "Titel", "Niet actieve bedrijven" } }));}
Run Code Online (Sandbox Code Playgroud)

局部视图

@model IEnumerable<xxx.Models.Bedrijf>

<table id="companytable">
    <tr>
        <th id="thtitle">
            @ViewData["Titel"]
        </th>
        <th id="thactions"></th>
    </tr>

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.ActionLink(@item.bedrijf_naam, "CompanyDetails", new { id = item.bedrijf_id }) 
            (@item.contacts.Count contact(en))



        </td>
        <td id="actions">
            @Html.ActionLink("Edit", "CompanyEdit", new { id=item.bedrijf_id }) |
            @Html.ActionLink("Details", "CompanyDetails", new { id = item.bedrijf_id }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.bedrijf_id })
        </td>
    </tr>
}
</table>
Run Code Online (Sandbox Code Playgroud)

在我的公司列表中,我想显示分配给该公司的联系人数量,但我得到以下错误:

已经有一个与此Connection关联的开放DataReader,必须先关闭它.

当转到我的.edmx文件并设置Lazy Loading Enabled:False我能够得到一个结果(但我的联系人的计数不起作用(我得到0),假设我的相关联系人现在没有加载.):

如何在启用延迟加载的情况下使用此功能?我的初学ASP.NET(MVC)技能目前还没有让我找到解决方案.

添加MultipleActiveResultSets = True; 在web.config connectionstring经常被指出为解决方案,但在我的情况下没有区别.

在延迟加载设置为False的同时尝试在我的CompanyRespository中使用.Include,但我认为我没有正确地执行此操作,因为我不熟悉它的语法.

这种描述也很有意义;

这不是关闭连接.EF正确管理连接.我对这个问题的理解是,在单个连接上执行多个数据检索命令(或者具有多个选择的单个命令),而在第一个DataReader完成读取之前执行下一个DataReader.避免异常的唯一方法是允许多个嵌套的DataReaders =启用MultipleActiveResultSets.总是发生这种情况的另一种情况是,当您遍历查询结果(IQueryable)时,您将在迭代内触发加载实体的延迟加载.

但不知道我应该如何使用此信息在我的代码中修复此问题.在哪里/如何使用@ item.contacts.Count来显示联系人数量?

提前致谢.

小智 15

我有类似的问题.注意到正在使用IEnumerable集合并且正在调用另一个函数,在那里查询数据库.由于它是IEnumerable集合,读者是开放的.将IEnumerable更改为列表以解决问题.

  • 我完成了@AbbsHere在我的这个问题的版本上提出的建议,只需在我的语句末尾添加一个.ToList()即可. (2认同)

Lad*_*nka 3

尝试使用这个:

public IQueryable<Bedrijf> getCompaniesByStatus(int status)
{
    return entities.Bedrijven
                   .Include("contacts")
                   .Where(c => c.bedrijf_status == status)
                   .OrderBy(c => c.bedrijf_naam);
}
Run Code Online (Sandbox Code Playgroud)

我认为 MySql 连接器可能不支持多个活动结果集,因此连接字符串中的设置对您没有帮助。