6

estoy tratando de tener una consulta en un método que tiene este aspecto:Entity Framework - ¿Mantiene los objetos relacionados cargados/incluidos después de usar end?

Public Shared Function listParticipationsByTeamCount(ByVal count As Integer, ByVal challenge As Challenge) As List(Of Participation) 
    Dim participationList As List(Of Participation) 

    If count <> Nothing And challenge IsNot Nothing Then 
     Using db As New DatabaseEntities() 
      participationList = db.Participations.Where(Function(x) x.TeamCount = count And x.Challenge.Id = challenge.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList() 
     End Using 
    End If 

    Return participationList 
End Function 

Tengo una tabla Participación, que tiene un muchos a 1 entre Participación y equipo mesa, y una relación de muchos a muchos entre Participación y TeamMember tabla. En mi página de marcado que intento algo como esto cuando iterar a través de la lista de este modo:

<% For Each participation As Participation In participationsList%> 
    <tr> 
     <td><a class="external-link" href="<%= participation.Team.Website %>"><%= participation.Team.Name%></a></td> 
     <td><%= participation.Percentage%>%</td> 
     <td> 
      <% For Each member As TeamMember In participation.TeamMembers%> 
       <%= member.Name%><br /> 
      <% Next%> 
     </td> 
    </tr> 
<% Next%> 

me sale el siguiente error:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Ahora entiendo que es porque puse la consulta dentro de una el uso y después de la End Using no puedo conseguir los objetos relacionados, al mirar esto he intentado cambiar la consulta la instrucción using a esto:

Using db As New DatabaseEntities() 
     participationList = db.Participations.Include("Team").Include("TeamMember").Where(Function(x) x.TeamCount = count And x.Team.Id = team.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList() 
End Using 

esto no funcionó. También traté de cargar referencias de entidades como estas:

Using db As New DatabaseEntities() 
     participationList = db.Participations.Where(Function(x) x.TeamCount = count And x.Team.Id = team.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList() 
    For each part as Participation in participationList 
      part.TeamReference.Load() 
      part.TeamMembers.Load() 
    Next 
End Using 

El error aún persiste. ¿Cómo puedo cargar todos estos objetos relacionados en mi lista de participación para poder hacer referencia a ellos aún después de que termine de usar ??? Sé que EF4 ahora hace lazyloading por defecto, pero incluso cuando cargué explícitamente objetos relacionados, parece que todavía no funciona.

Edit: Gracias por todas las respuestas, se trataba de no incluir el TeamMembers, ya que era una colección. Esto rompió toda la consulta. Así que la respuesta es:

Using db As New DatabaseEntities() 
     participationList = db.Participations.Include("Team").Include("TeamMembers").Where(Function(x) x.TeamCount = count And x.Team.Id = team.Id).OrderByDescending(Function(x) x.TeamCount).ThenBy(Function(x) x.Team.Name).ToList() 
End Using 
+2

Al usar Include y llamar a ToList debería obtener todos los datos necesarios y ObjectContext no debería ser necesario más adelante. ¿Podría verificar la consulta que se envía a la base de datos? A veces, EF ignora el Incluir aunque este caso no debería. –

+2

En 'If count <> Nothing Y el equipo IsNot Nothing Then' ¿de dónde viene' team'? ¿Qué línea en su marcado está causando la excepción? ¿Es esto asp.net mvc? –

+0

Ah, lo siento Brian, estaba haciendo abstracción de mis nombres de objeto para no dar ninguna indicación de dónde trabajo (como hubiera sucedido) y olvidé cambiar uno.La línea específica que está causando el error es: '<%= participation.Team.Name%>' Cuando intenta obtener el objeto relacionado. No, no es MVC. – SventoryMang

Respuesta

2

En el tercer bloque de código está incluyendo TeamMember. Sin embargo, por lo que puedo ver en el segundo bloque de código, las propiedades de navegación están en plural, así que intente incluir TeamMembers en su lugar.

+0

Heh, creo que esto fue todo. Si bien el objeto Team tampoco se incluyó, el hecho de que el segundo incluya fue singular, creo que eso lo rompió todo. No hay errores después de hacer esto. – SventoryMang

3

El problema parece ser que va a configurar la consulta pero no ejecutarlo.

  • Solo tiene acceso a la base de datos cuando se encuentra dentro de la instrucción using.
  • La solicitud se envía a la base de datos cuando realmente intenta utilizar los datos.

Por lo tanto, debe recorrer sus datos y colocarlos dentro de un objeto de dominio, antes de salir de la instrucción de uso.

+0

Ya estoy haciendo esto. Desde mi primer bloque de código puede ver que estoy almacenando en una lista de objetos de dominio y al establecer la consulta .ToList() lo obliga a enumerar dentro del uso. También puede ver dentro de mi último bloque de código en mi publicación, intenté iterar a través de la lista para cargar explícitamente los objetos. Entonces parece que ya estoy haciendo lo que sugirió y no elimina el error. – SventoryMang

+0

¿Cuál es el tipo de su Lista de participación? –

+0

Mirar en mi primer bloque de código, es 'Lista de participación reducida como lista (de participación)'. En mis bloques inferiores, solo estaba reemplazando lo que estaba dentro de la declaración de uso del primer bloque. – SventoryMang

Cuestiones relacionadas