2015-07-12 26 views
37

Il caricamento lento in Entity Framework è il fenomeno predefinito che si verifica per il caricamento e l'accesso alle entità correlate. Tuttavia, il carico impaziente è riferito alla pratica del caricamento forzato di tutte queste relazioni. Mi sono imbattuto nella domanda su quale situazione il carico impaziente potrebbe essere più vantaggioso del carico pigro. Chiedendo questo, perché è ovvio che il caricamento lazy è più favorevole alle risorse, e anche se utilizziamo il metodo ToList(), possiamo ancora approfittare del comportamento di caricamento lento. Tuttavia, ho pensato che forse il caricamento pigro aumentasse il numero di richieste al database reale e forse questo è il motivo per cui a volte gli sviluppatori usano il metodo Inlcude per forzare il caricamento di tutte le relazioni. Ad esempio, quando si utilizza lo scaffolding automatico di Visual Studio in MVC 5, il metodo Index creato automaticamente nel controller utilizza sempre Eager Loading e ho sempre avuto la domanda sul motivo per cui Microsoft utilizza Eager Loading per impostazione predefinita in quel caso.Lazy Loading vs Eager Loading

Sarei grato se qualcuno mi spiegasse in quale situazione il caricamento ansioso sarebbe più vantaggioso del caricamento pigro, e perché lo usiamo mentre c'è qualcosa di più facile da usare come Lazy Loading.

+6

Immagina una situazione in cui il tuo contesto db sarebbe stato smaltito e il caricamento lento non poteva più avvenire. Quindi il carico impaziente è vantaggioso. – Transcendent

+1

Ho visto un sacco di progetti falliti a causa di problemi di prestazioni dovuti al problema "N + 1 Select" che si verifica più velocemente quando si esegue il caricamento lento, quindi assicuratevi di vederlo su –

risposta

37

penso che sia buona per classificare i rapporti come questo

Quando usare eager loading

  1. In "un lato" delle relazioni uno-a-molti che si sicuro siete abituati ogni dove con l'entità principale. come la proprietà dell'utente di un articolo. Proprietà di categoria di un prodotto.
  2. Generalmente quando le relazioni non sono eccessive e il caricamento impaziente sarà una buona pratica per ridurre ulteriori query sul server.

Quando utilizzare lazy loading

  1. Quasi da ogni lato "raccolta" delle relazioni uno-a-molti. come articoli di utenti o prodotti di una categoria
  2. Sai esattamente che non avrai bisogno di una proprietà all'istante.

Nota: come trascendente ha detto che ci possono essere problemi di smaltimento con caricamento pigro.

+5

Sto solo cercando di rispondere alla stessa cosa. Usa il caricamento lento quando sai che raramente dovrai utilizzare i dati correlati. Ma quando sai che vorrai determinati dati correlati abbastanza spesso, usa un caricamento entusiasmante. –

8

Il caricamento lento genera diverse chiamate SQL mentre il caricamento Eager può caricare i dati con una chiamata "più pesante" (con join/sottoquery).

Ad esempio, se c'è un ping elevato tra i server web e sql, si utilizzerà il caricamento Eager invece di caricare gli elementi correlati 1 per 1 con il caricamento lento.

9

considerare la situazione sotto

public class Person{ 
    public String Name{get; set;} 
    public String Email {get; set;} 
    public virtual Employer employer {get; set;} 
} 

public List<EF.Person> GetPerson(){ 
    using(EF.DbEntities db = new EF.DbEntities()){ 
     return db.Person.ToList(); 
    } 
} 

Ora, dopo questo metodo viene chiamato non, è possibile caricare pigro l'entità Employer più. Perché? perché l'oggetto db è stato eliminato. Quindi devi fare Person.Include(x=> x.employer) per forzare il caricamento.

+2

Sì, questo è un esempio in cui il caricamento lento non aiuta. Un'altra cosa è che la creazione di DbContext ogni volta che avrai bisogno di alcuni dati è cattiva. Se possiedi un contenitore IoC, il tuo DbContext vivrà insieme a Request (in caso di app web). –

+0

@MiroslavHolec: geniale, questo è quello che effettivamente faccio usando Ninject. Quello che hai appena menzionato è davvero molto bello. – Transcendent

0
// Using LINQ and just referencing p.Employer will lazy load 
// I am not at a computer but I know I have lazy loaded in one 
// query with a single query call like below. 
List<Person> persons = new List<Person>(); 
using(MyDbContext dbContext = new MyDbContext()) 
{ 
    persons = (
     from p in dbcontext.Persons 
     select new Person{ 
      Name = p.Name, 
      Email = p.Email, 
      Employer = p.Employer 
     }).ToList(); 
} 
+0

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – Arefly

+0

Questa risposta non risolve affatto la questione degli OP. L'OP non sta chiedendo come eseguire il 'caricamento Lazy', sta chiedendo" quando usare 'Lazy loading' e quando' Eager Loading' " – Mischa

5

eager loading: Eager Loading vi aiuta a caricare tutti i vostri soggetti necessari in una sola volta. cioèoggetti correlati (oggetti figlio) vengono caricati automaticamente con il relativo oggetto padre.

quando usarlo:

  1. Usa Eager Loading quando i rapporti non sono troppi. Pertanto, il caricamento Eager è una buona pratica per ridurre ulteriori query sul server.
  2. Utilizza il caricamento Eager quando sei sicuro di utilizzare le entità correlate con l'entità principale ovunque.

lazy loading: In caso di caricamento pigro, gli oggetti correlati (oggetti figlio) non vengono caricati automaticamente con il suo oggetto padre fino a quando non sono richiesti. Per impostazione predefinita LINQ supporta il caricamento lazy.

quando usarlo:

  1. Usa caricamento pigro quando si utilizza collezioni uno-a-molti.
  2. Utilizzare il caricamento lento quando si è sicuri di non utilizzare le entità correlate all'istante.

NOTA: Entity Framework supporta tre modi per caricare i dati relativi - desiderosi di carico, lazy loading e il caricamento esplicito.

Problemi correlati