web-dev-qa-db-de.com

Lazy Loading gegen Eager Loading

Das verzögerte Laden in Entity Framework ist das Standardphänomen, das beim Laden und Zugreifen auf die zugehörigen Entitäten auftritt. Das eifrige Laden bezieht sich jedoch auf die Praxis des zwangsweisen Ladens all dieser Beziehungen. Ich bin auf die Frage gestoßen, in welcher Situation eifriges Laden vorteilhafter sein könnte als faules Laden. Dies zu fragen, da es offensichtlich ist, dass das verzögerte Laden ressourcenschonender ist, und auch wenn wir die ToList() -Methode verwenden, können wir das verzögerte Ladeverhalten nutzen. Ich dachte jedoch, dass ein verzögertes Laden die Anzahl der Anforderungen an die eigentliche Datenbank erhöht und dass Entwickler deshalb manchmal die Inlcude -Methode verwenden, um das Laden aller Beziehungen zu erzwingen. Wenn Sie beispielsweise das Auto-Scaffolding von Visual Studio in MVC 5 verwenden, verwendet die Indexmethode, 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ären würde, in welcher Situation eifriges Laden günstiger ist als faules Laden, und warum wir es überhaupt verwenden, während es etwas ressourcenschonenderes als faules Laden gibt.

60
Arrrr

Ich finde es gut, Beziehungen wie diese zu kategorisieren

Wann sollte eifriges Laden verwendet werden?

  1. In "einer Seite" von Eins-zu-Viele-Beziehungen, die Sie mit Sicherheit überall mit der Hauptentität verwenden. wie Benutzereigenschaft eines Artikels. Kategorieeigenschaft eines Produkts.
  2. Im Allgemeinen ist es empfehlenswert, weitere Anfragen auf dem Server zu reduzieren, wenn die Beziehungen nicht zu groß sind und das Laden eifrig ist.

Wann sollte Lazy Loading verwendet werden?

  1. Fast auf jeder "Sammlungsseite" von Eins-zu-Viele-Beziehungen. wie Artikel des Benutzers oder Produkte einer Kategorie
  2. Sie wissen genau, dass Sie eine Immobilie nicht sofort brauchen werden.

Anmerkung: wie Transcendent sagte, kann es ein Entsorgungsproblem beim langsamen Laden geben.

62
farid bekran

Eager Loading: Mit Eager Loading können Sie alle benötigten Entitäten auf einmal laden. verwandte Objekte (untergeordnete Objekte) werden automatisch mit ihrem übergeordneten Objekt geladen.

Wann zu verwenden:

  1. Verwenden Sie Eager Loading, wenn die Relationen nicht zu groß sind. Daher empfiehlt sich Eager Loading, um weitere Anfragen auf dem Server zu reduzieren.
  2. Verwenden Sie Eager Loading, wenn Sie sicher sind, dass Sie überall verwandte Entitäten mit der Hauptentität verwenden werden.

Lazy Loading: Beim Lazy Loading werden verwandte Objekte (untergeordnete Objekte) erst nach Aufforderung automatisch mit dem übergeordneten Objekt geladen. Standardmäßig unterstützt LINQ das verzögerte Laden.

Wann zu verwenden:

  1. Verwenden Sie Lazy Loading, wenn Sie eine bis mehrere Sammlungen verwenden.
  2. Verwenden Sie Lazy Loading, wenn Sie sicher sind, dass Sie verwandte Entitäten nicht sofort verwenden.

ANMERKUNG: Entity Framework unterstützt drei Möglichkeiten zum Laden verwandter Daten: Eifriges Laden, verzögertes Laden und explizites Laden.

17
Dark Matter

Beim verzögerten Laden werden mehrere SQL-Aufrufe ausgeführt, während beim eifrigen Laden möglicherweise Daten mit einem "schwereren" Aufruf geladen werden (mit Verknüpfungen/Unterabfragen).

Beispiel: Wenn zwischen Ihren Web- und SQL-Servern ein hoher Ping auftritt, wird Eager geladen, anstatt verwandte Elemente 1-zu-1 mit verzögertem Laden zu laden.

16
serhiyb

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 Entität Employer nicht mehr verzögert laden. Warum? weil das Objekt db entsorgt wird. Sie müssen also Person.Include(x=> x.employer) ausführen, um das Laden zu erzwingen.

10
Transcendent

Eifriges Laden Wenn Sie sicher sind, dass mehrere Entitäten gleichzeitig abgerufen werden sollen, z. B. Benutzer und Benutzerdetails auf derselben Seite angezeigt werden 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 wenn Sie auf Benutzer klicken, um Benutzerdetails anzuzeigen, müssen Sie mit Lazy loading fortfahren. Beim langsamen Laden werden mehrere Treffer ausgeführt, um die zugehörigen Entitäten zu laden, wenn Sie zugehörige Entitäten binden/iterieren.

3
Sheriff
// 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
Matt Empringham