7

Esta pregunta está relacionada con this:Entity Framework: Ya hay un DataReader abierto asociado con este comando que debe estar cerrada primera

Mi método repositorio tiene este código:

public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId) 
     { 
      return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition) ; 
     } 

Mi HTML tiene este código:

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.applicantPosition.Position.name) 
     </td> 

La excepción es completa:

Ya hay un DataReader abierto asociado con este comando que debe cerrarse primero.

Fue un tiro en la primera línea del HTML @ Html.DisplayFor (ModelItem => item.applicantPosition.Applicant.name)

Respuesta

20

solución rápida:

public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId) 
    { 
     return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition).ToList() ; 
    } 

Si usted quiere saber, ¿por qué esta fijación de su problema, leer acerca de cómo LINQ y ejecución diferida funciona. En pocas palabras, si no "fuerza" la ejecución de la selección al "enumerar" la consulta de ToList, de hecho, se ejecuta demasiado tarde, a la vista. Y esto está causando problemas con otras consultas que desean usar la misma conexión.

+0

Este mismo error ocurrió cuando reimplementé dos clases de modelo similares para heredar de una clase base de modelo usando una estructura de herencia TPH, donde había una relación de uno a cero o uno en una de las clases derivadas, y estaba usando carga ansiosa en el controlador para ese modelo. Por lo que entiendo, la carga ansiosa no es compatible en este caso, por lo que soltar el '.Include (...)' para esta propiedad en el controlador, y agregar '.ToList()' al final de mi 'restante. Las sentencias Include (...) 'parecen haber solucionado el problema, gracias. –

1

Generalmente no use EF objeto a la vista, pero crear un objeto para POCO la vista modela y mapea el resultado de la consulta en el modelo de vista. EF no ejecuta la consulta en su método de repositorio porque la consulta no se ejecuta en el momento de la definición, sino solo cuando intenta acceder a los datos. En su opinión, está usando la misma consulta muchas veces y esto no es correcto.

Si desea acceder a la lista de objeto devuelto por el método de repositorio, utilice toList

0

El problema real es que usted es una referencia de Carga lenta de la posición desde la entidad SolicitantePosición antes de que la consulta finalice esta ejecución. Si desea mantener la ejecución diferida en ese escenario, puede cargar la referencia de Posición en su consulta de la siguiente manera:

Incluir (o => o.applicantPosition.Select (a => a.Position));

y en su GetApplicationPositionHistories sigue devolviendo el IEnumerable.

La otra solución es ejecutar realmente la consulta en el método GetApplicationPositionHistories llamando a los métodos ToList() o ToArrray() en la consulta.

6

Este error se produce cuando se va a ejecutar una nueva consulta mientras se está dentro de otra consulta. Considere usted tiene algo como esto en su vista

@Html.DisplayFor(modelItem => item.Device.Name) 

y en su modelo del dispositivo Tiene

public string Name 
    { 
     get 
     { 
      return String.Format("{0} {1}", Brand.BrandName, Model.ModelName); 
     } 
    } 

continuación, ya que para la evaluación de dispositivos.Nombre que se requiere para consultar su marca y modelo que se convertirá en el interior de consulta y consulta lo que la solución es permitir MutlipleActiveResultSets en la cadena de conexión de base de datos de la siguiente manera:

<add name="MyDBContext" connectionString="Data Source=.;Initial Catalog=mydb;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
12

Ha intentado añadir MultipleActiveResultSets=true; a la cadena de conexión?

+2

Estaba usando el contexto. . Búsqueda (id), que por algún motivo causa el error mencionado por OP. Agregar esta configuración a la cadena de conexión resolvió el problema. – CodeMonkey

Cuestiones relacionadas