Caricamento pigro vs caricamento Eager

Il caricamento lento in Entity Framework è il fenomeno predefinito che si verifica per il caricamento e l’accesso alle entity framework 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 usiamo il metodo ToList() , possiamo ancora approfittare del comportamento di caricamento pigro. 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.

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ù amichevole come il Lazy Loading.

Penso che sia buono categorizzare relazioni come questa

Quando usare il carico desideroso

  1. In “un lato” delle relazioni uno-a-molti che sicuramente utilizzate ovunque con l’ quadro 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 il caricamento lazy

  1. Quasi su ogni “collezione” di relazioni uno-a-molti. come articoli di utente o prodotti di una categoria
  2. Sai esattamente che non avrai bisogno di una proprietà all’istante.

Nota: come il Trascendente ha detto che potrebbe esserci un problema di smaltimento con il caricamento lento.

Caricamento di Eager: il caricamento di Eager ti aiuta a caricare tutte le quadro necessarie contemporaneamente. cioè gli oggetti correlati (oggetti figlio) vengono caricati automaticamente con il suo object genitore.

Quando usare:

  1. Utilizza il caricamento Eager quando le relazioni non sono eccessive. Pertanto, Eager Loading è una buona pratica per ridurre ulteriori query sul Server.
  2. Utilizza il caricamento Eager quando sei sicuro che userai le quadro correlate con l’ quadro principale ovunque.

Caricamento lento : in caso di caricamento lento, gli oggetti correlati (oggetti figlio) non vengono caricati automaticamente con l’object principale fino a quando non vengono richiesti. Per impostazione predefinita LINQ supporta il caricamento lazy.

Quando usare:

  1. Utilizza il caricamento lento quando si utilizzano raccolte uno-a-molti.
  2. Usa il caricamento lento quando sei sicuro di non utilizzare istantaneamente entity framework correlate.

NOTA: Entity Framework supporta tre modi per caricare i dati correlati: caricamento ansioso, caricamento lento e caricamento esplicito.

Il caricamento lento produrrà diverse chiamate SQL mentre il caricamento Eager potrebbe caricare i dati con una chiamata “più pesante” (con join / sottoquery).

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

Considera la seguente situazione

 public class Person{ public String Name{get; set;} public String Email {get; set;} public virtual Employer employer {get; set;} } public List GetPerson(){ using(EF.DbEntities db = new EF.DbEntities()){ return db.Person.ToList(); } } 

Ora, dopo aver chiamato questo metodo, non è più ansible caricare pigro l’entity framework del Employer . Perché? perché l’object db è eliminato. Quindi devi fare in modo Person.Include(x=> x.employer) per forzare il caricamento.

 // 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 persons = new List(); using(MyDbContext dbContext = new MyDbContext()) { persons = ( from p in dbcontext.Persons select new Person{ Name = p.Name, Email = p.Email, Employer = p.Employer }).ToList(); }