错误:“关闭datareader时调用'Read'......”

时间:2015-04-25 09:51:30

标签: asp.net-mvc entity-framework

以下是我的观点中的代码:

@model IEnumerable<Sample2.Models.Leave_GetDetails_Result1>

@{
    ViewBag.Title = "Index";
}

<div>
    @foreach (var item in Model) { 
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.LA_StaffCode)
        </dt>

        <dd>
            @Html.DisplayFor(model => item.LA_StaffCode)
        </dd>

        <dd>
            @Html.DisplayFor(model => item.LA_AppNo)
        </dd>
    </dl>
    }
</div>
<p>
    @*@Html.ActionLink("Edit", "Edit", new { id = Model.Staff_Code }) |*@
    @Html.ActionLink("Back to List", "Index")
</p>

当我执行时,它会出错:

"Calling 'Read' when datareader is closed is not a valid operation"

编辑:

Controller代码位于我调用存储过程的位置:

using (var context = new Admin_TestEntities())
{
    var data = context.Leave_GetDetails("Recommended");
    return View(data.AsEnumerable());
}

1 个答案:

答案 0 :(得分:2)

您需要在数据访问层中调用ToList之类的方法来强制将请求发送到数据库:

using (var context = new Admin_TestEntities())
{
    var data = context.Leave_GetDetails("Recommended").ToList();
    return View(data);
}

AsEnumerable()等方法不向数据库发出请求。只有在您第一次访问数据时(在您的情况下 - 在视图中)或显式调用调用数据库的方法(例如ToList())时才会发出请求。

您收到错误,因为当您尝试访问视图中的对象时,这是实际调用数据库的时间,但同时您的对象context已被释放。要修复它,您应该在上下文尚未处理时使用ToList显式强制数据库查询,即在控制器方法中