Entity Framework: come disabilitare il caricamento lento per query specifiche?


89

C'è un modo per disabilitare il caricamento lento per query specifiche su Entity Framework 6? Voglio usarlo regolarmente, ma a volte voglio disabilitarlo. Sto usando proprietà virtuali per caricarle in modo pigro.


20
impostare context.Configuration.LazyLoadingEnabled = false; prima della query che si desidera eseguire
Karthik Ganesan

5
Potresti semplicemente impostare il valore this.Configuration.LazyLoadingEnabled = false;, quindi impostarlo di nuovo this.Configuration.LazyLoadingEnabled = true;? Inoltre, è possibile leggere questo msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
grazie @KarthikGanesan. Ha funzionato come previsto.
Marco Alves

@KarthikGanesan Puoi mettere il tuo commento come risposta? Funziona davvero bene :)
Sampath

1
Aggiunto il commento come risposta @Sampath
Karthik Ganesan

Risposte:


76

impostare il codice seguente prima della query che si desidera eseguire

context.Configuration.LazyLoadingEnabled = false;

40

È possibile disabilitare il caricamento lento per query specifiche come segue:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

21

Potrei perdere qualcosa qui, ma piuttosto che cambiare la configurazione ogni volta, potrebbe essere un altro approccio da utilizzare .Include()solo su quelle query in cui desideri caricare con impazienza?

Supponiamo di avere una Productclasse che ha una proprietà di navigazione su una Colourclasse, potresti caricare il Colourper un Productcome questo -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
Per me questa è la migliore risposta qui!
Ian

Questo è insufficiente se si desidera caricare solo "prodotti", senza alcuna inclusione.
Mackan

Quindi vorresti ottenere "Prodotti" senza nessuno dei loro oggetti correlati o "Prodotti con tutti i loro oggetti correlati?"
Parrybird

1
Risposta molto più utile. Questo controlla le tabelle di sottoordinate specifiche che vengono caricate nel punto in cui viene costruita la query. Per qualsiasi problema del mondo reale questa deve essere la strada da percorrere.
Richard Petheram

5
È utile in un modo diverso ... se lo fai in questo modo potresti comunque ottenere un caricamento lento per un'altra raccolta da "Prodotti". In realtà, disabilitare il caricamento lento è più efficace per garantire che tutti i dati necessari vengano recuperati in anticipo ed evita di creare colli di bottiglia nascosti nelle prestazioni.
Doug

15

Vai alle proprietà del diagramma e trova una proprietà designata per il caricamento lento e disabilitala.

Se stai usando prima il codice, vai alla tua area di configurazione e disabilitalo da lì con:

this.Configuration.LazyLoadingEnabled = false;

6
Molte persone stanno visitando questa domanda e voglio dire, le persone NON SCRIVONO DOMANDE SENZA DARE UN'OCCHIATA AL PIANO DI ESECUZIONE. Sappi sempre cosa invia il tuo codice al database o avrai problemi di prestazioni. È possibile utilizzare linq pad o altri strumenti per visualizzare la query reale e controllare.
Juan


3

Un altro approccio per un'altra versione di EF (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

Quando contextè una ObjectContext, il predecessore più o meno deprecato del suo involucro, DbContext.
Gert Arnold

2

Supponi di avere questo:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

Avresti comunque un caricamento lento, nonostante l'impostazione esplicita di non farlo. La soluzione è semplice, cambiala in questo:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.