2015-04-25 2 views
0

Вот код из моего обзора:Ошибка: "Вызов 'Read', когда DataReader закрыта ...."

@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" 

Отредактировано :

код контроллера находится ниже, где я вызова хранимой процедуры:

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

ответ

2

Вы должны вызвать метод, как ToList в вас уровень доступа к данным, чтобы заставить запрос к базе данных:

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

Такие методы, как AsEnumerable() не делают запрос к базе данных. Запрос выполняется только при первом доступе к данным (в вашем случае - в представлении) или при явном вызове метода, который вызывает вызов в базе данных (например, ToList()).

Вы получаете сообщение об ошибке, поскольку, когда вы пытаетесь получить доступ к объекту в своем представлении, это когда фактически выполняется вызов в базу данных, но в то же время ваш объект context уже удален. Чтобы исправить это, вы должны явно принудительно использовать запрос базы данных с использованием ToList, пока контекст еще не установлен, то есть в вашем методе контроллера.

+0

Спасибо, сработало. – RKh

Смежные вопросы