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
Quando utilizzare il caricamento lazy
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:
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:
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(); }