Das verzögerte Laden in Entity Framework ist das Standardphänomen beim Laden und Zugreifen auf die zugehörigen Entitäten. Eifriges Laden bezieht sich jedoch auf die Praxis des Belastens all dieser Beziehungen. Ich bin auf die Frage gestoßen, in welcher Situation eifriges Laden vorteilhafter sein könnte als faules Laden. Fragen Sie dies, da es offensichtlich ist, dass verzögertes Laden ressourcenschonender ist, und selbst wenn wir die ToList()
Methode verwenden, können wir das verzögerte Ladeverhalten dennoch nutzen. Ich dachte jedoch, dass ein verzögertes Laden die Anzahl der Anforderungen an die eigentliche Datenbank erhöht, und vielleicht verwenden Entwickler deshalb manchmal dieInlcude
Methode zum erzwungenen Laden aller Beziehungen. Wenn Sie beispielsweise das automatische Visual Studio-Gerüst in MVC 5 verwenden, verwendet die Index-Methode, die automatisch im Controller erstellt wird, immer Eager Loading, und ich hatte immer die Frage, warum Microsoft in diesem Fall standardmäßig Eager Loading verwendet.
Ich würde mich freuen, wenn mir jemand erklärt, in welcher Situation eifriges Laden vorteilhafter ist als faules Laden, und warum wir es überhaupt verwenden, während es etwas ressourcenschonenderes gibt als Lazy Loading.
quelle
Antworten:
Ich denke, es ist gut, solche Beziehungen zu kategorisieren
Wann sollte man eifriges Laden verwenden?
Wann ist Lazy Loading zu verwenden?
Hinweis: Wie Transcendent sagte, liegt möglicherweise ein Entsorgungsproblem beim verzögerten Laden vor.
quelle
Eifriges Laden: Eifriges Laden hilft Ihnen, alle benötigten Entitäten gleichzeitig zu laden. dh verwandte Objekte (untergeordnete Objekte) werden automatisch mit ihrem übergeordneten Objekt geladen.
Wann zu verwenden:
Lazy Loading: Beim Lazy Loading werden verwandte Objekte (untergeordnete Objekte) erst dann automatisch mit dem übergeordneten Objekt geladen, wenn sie angefordert werden. Standardmäßig unterstützt LINQ das verzögerte Laden.
Wann zu verwenden:
quelle
Beim verzögerten Laden werden mehrere SQL-Aufrufe ausgeführt, während beim eifrigen Laden möglicherweise Daten mit einem "schwereren" Aufruf (mit Joins / Unterabfragen) geladen werden.
Wenn beispielsweise zwischen Ihrem Web und den SQL-Servern ein hoher Ping-Wert besteht, wird das Eager-Laden fortgesetzt, anstatt die zugehörigen Elemente 1: 1 mit dem verzögerten Laden zu laden.
quelle
Betrachten Sie die folgende Situation
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(); } }
Nachdem diese Methode aufgerufen wurde, können Sie die
Employer
Entität nicht mehr verzögert laden . Warum? weil dasdb
Objekt entsorgt ist. Sie müssenPerson.Include(x=> x.employer)
also das Laden erzwingen.quelle
Eifriges Laden Wenn Sie sicher sind, dass mehrere Entitäten gleichzeitig abgerufen werden sollen, z. B. Benutzer und Benutzerdetails auf derselben Seite anzeigen müssen, sollten Sie mit dem eifrigen Laden fortfahren. Eifriges Laden führt zu einem einzigen Treffer in der Datenbank und lädt die zugehörigen Entitäten.
Lazy Loading Wenn Sie Benutzer nur auf der Seite anzeigen müssen und durch Klicken auf Benutzer Benutzerdetails anzeigen müssen, müssen Sie mit Lazy Loading fortfahren. Beim verzögerten Laden werden mehrere Treffer erzielt, um die zugehörigen Entitäten zu laden, wenn Sie verwandte Entitäten binden / iterieren.
quelle
Lazy Loading - ist gut, wenn mit Paginierung wie auf der Seite geladen wird. Es wird eine Liste mit Benutzern angezeigt, die 10 Benutzer enthält. Wenn der Benutzer die Seite nach unten scrollt, bringt ein API-Aufruf die nächsten 10 Benutzer. Es ist gut, wenn Sie keine vollständigen Daten bei laden möchten einmal, da es mehr Zeit in Anspruch nehmen und eine schlechte Benutzererfahrung bieten würde.
Eifriges Laden - ist gut, wie andere Leute vorgeschlagen haben, wenn nicht viele Beziehungen bestehen und ganze Daten auf einmal in einem einzigen Aufruf der Datenbank abgerufen werden
quelle
Es ist besser, eifriges Laden zu verwenden, wenn dies möglich ist, da dies die Leistung Ihrer Anwendung optimiert.
Ex-:
Eager loading var customers= _context.customers.Include(c=> c.membershipType).Tolist(); lazy loading
Im Modell muss der Kunde definieren
Public virtual string membershipType {get; set;}
Wenn Sie also das verzögerte Laden abfragen, wird das Laden aller Referenzobjekte viel langsamer, aber das eifrige Laden fragt ab und wählt nur das Objekt aus, das relevant ist.
quelle
// 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(); }
quelle
Lazy loading
, er fragt nach "wannLazy loading
und wannEager Loading
"