Come garantite che il contesto del vostro database sia smaltito correttamente quando la vostra collezione pigra non è più necessaria?

7

Sto cercando un tipo di risposta alle migliori pratiche qui.

Dato che le migliori pratiche per interagire con le classi che implementano IDisposable è tramite l'istruzione Using - Qual è la migliore pratica per l'utilizzo del caricamento pigro EF con MVC?

Esempio di metodo di controllo:

<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

Questo esempio rende il caricamento pigro non funzionante perché il database [dataContext] viene eliminato dal momento in cui il modello arriva nella vista.

Quindi immagino che la domanda sia:
Quali sono le migliori pratiche per l'utilizzo del caricamento lazy in MVC? Come garantite che il contesto del vostro database sia smaltito correttamente e che non provochino perdite di memoria?

    
posta Sam Axe 19.02.2015 - 04:30
fonte

1 risposta

8

In generale, non è necessario utilizzare le istruzioni Using con i contesti di dati di Entity Framework. Le collezioni pigre è uno dei motivi per cui. Quindi il tuo codice sarebbe semplicemente:

<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

I contesti di dati in Entity Framework sono progettati per aprire e chiudere le connessioni in base alle esigenze e si dispongono automaticamente quando l'oggetto contesto dati non è più necessario.

The default behavior of DbContext is that the underlying connection is automatically opened any time is needed and closed when it is no longer needed. E.g. when you execute a query and iterate over query results using “foreach”, the call to IEnumerable.GetEnumerator() will cause the connection to be opened, and when later there are no more results available, “foreach” will take care of calling Dispose on the enumerator, which will close the connection.

L'unica volta in cui dovresti stare attento a IDisposable è se tu Override i comportamenti di default del contesto dati.

Ulteriori letture

Devo sempre chiamare Dispose su DBContext ? No.
Gestire DbContext nel modo giusto con Entity Framework 6: una guida approfondita

    
risposta data 19.02.2015 - 04:39
fonte

Leggi altre domande sui tag