¿Cómo garantiza que el contexto de su base de datos se elimine correctamente cuando ya no se necesita su colección perezosa?

7

Estoy buscando un tipo de respuesta de mejores prácticas aquí.

Teniendo en cuenta que las mejores prácticas para interactuar con las clases que implementan IDisposable son a través de la declaración Using . ¿Cuál es la mejor práctica para usar EF con carga lenta con MVC?

Método de controlador de ejemplo:

<HttpGet>
Public Function Schedule(ByVal id As Int64) As ActionResult

    Dim model As Schedule = Nothing
    Using database As dataContext = New dataContext
        model = (From s In database.Schedules Where s.ScheduleID = id Select s).FirstOrDefault
    End Using

    Return View(theSchedule)

End Function

Este ejemplo hace que la carga diferida no funcione porque la base de datos [dataContext] está dispuesta por hora en que el modelo llega a la Vista.

Así que supongo que la pregunta es:
¿Cuáles son las mejores prácticas para usar la carga diferida en MVC? ¿Cómo garantiza que el contexto de su base de datos se elimine correctamente y que no cause pérdidas de memoria?

    
pregunta Sam Axe 19.02.2015 - 04:30

1 respuesta

8

En general, no es necesario usar Using en los contextos de datos de Entity Framework. Colecciones perezosas es una de las razones por las que. Entonces tu código simplemente sería:

<HttpGet>
Public Function Schedule(ByVal id As Int64) As ActionResult

    Dim model As Schedule = Nothing
    Dim database As dataContext = New dataContext
    model = (From s In database.Schedules Where s.ScheduleID = id Select s).FirstOrDefault

    Return View(model)

End Function

Los contextos de datos en Entity Framework están diseñados para abrir y cerrar conexiones según sea necesario, y se eliminan automáticamente cuando el objeto de contexto de datos ya no es necesario.

  

El comportamiento predeterminado de DbContext es que la conexión subyacente se abre automáticamente cada vez que se necesita y se cierra cuando ya no es necesaria. P.ej. cuando ejecuta una consulta e itera sobre los resultados de la consulta usando "foreach", la llamada a IEnumerable.GetEnumerator () hará que la conexión se abra, y cuando más adelante no haya más resultados disponibles, "foreach" se ocupará de llamar en el enumerador, que cerrará la conexión.

La única vez que tendría que tener cuidado con IDisposable es si Override de los comportamientos predeterminados del contexto de datos.

Lecturas adicionales

¿Siempre tengo que llamar a Dispose en DBContext? ? No.
Administre DbContext de manera correcta con Entity Framework 6: una guía en profundidad

    
respondido por el Robert Harvey 19.02.2015 - 04:39

Lea otras preguntas en las etiquetas