web-dev-qa-db-ger.com

Welche Auswirkungen kann das virtuelle Schlüsselwort in Entity Framework 4.1 POCO Code First haben?

Wirkt sich das Schlüsselwort virtual auf die Eigenschaften in EF Code First aus? Kann jemand alle Folgen in verschiedenen Situationen beschreiben?

Ich weiß zum Beispiel, dass es steuern kann verzögertes Laden - Wenn Sie das virtuelle Schlüsselwort für eine ICollection/one-to-many-Beziehungseigenschaft verwenden, wird es standardmäßig verzögert geladen, wohingegen, wenn Sie es verlassen das virtuelle Schlüsselwort heraus, wird es gespannt sein.

Welche anderen Auswirkungen kann das Schlüsselwort virtual in EF mit POCO-Entitäten haben ?. Soll ich standardmäßig virtual für alle meine Eigenschaften verwenden oder standardmäßig nicht verwenden?

219
Scott Stafford

Bisher kenne ich diese Effekte.

  • Lazy Loading : Alle virtual ICollections werden faul geladen, sofern Sie sie nicht ausdrücklich anders kennzeichnen.
  • Effizientere Änderungsverfolgung . Wenn Sie alle folgenden Anforderungen erfüllen, kann Ihre Änderungsnachverfolgung eine effizientere Methode verwenden, indem Sie Ihre virtuellen Eigenschaften einbinden. Über den Link:

    Grundsätzlich gilt, dass Ihre Klasse öffentlich, nicht abstrakt oder nicht versiegelt sein muss, um Änderungsnachverfolgungs-Proxys zu erhalten. Ihre Klasse muss außerdem öffentliche virtuelle Getter/Setter für alle Eigenschaften implementieren, die beibehalten werden. Schließlich müssen Sie die auf Auflistungen basierenden Beziehungsnavigationseigenschaften nur als ICollection<T> Deklarieren. Sie können keine konkrete Implementierung oder eine andere Schnittstelle sein, die von ICollection<T> Abgeleitet ist (ein Unterschied zum Proxy für verzögertes Laden).

Ein weiterer nützlicher Link, der dies beschreibt, ist MSDN's Anforderungen zum Erstellen von POCO-Proxies .

187
Scott Stafford

Dieses virtuelle Schlüsselwort bezieht sich auf das Thema des Ladens von Daten aus dem Entitätsframework (verzögertes Laden, eifriges Laden und explizites Laden).

Sie sollten das Schlüsselwort virtual verwenden, wenn Sie Daten mit verzögertem Laden laden möchten.

verzögertes Laden ist der Vorgang, bei dem eine Entität oder eine Sammlung von Entitäten beim ersten Zugriff automatisch aus der Datenbank geladen wird.

Wenn Sie beispielsweise die unten definierte Blog-Entitätsklasse verwenden, werden die zugehörigen Posts beim ersten Zugriff auf die Posts-Navigationseigenschaft geladen:

public class Blog 
{  
     public int BlogId { get; set; }  
     public string Name { get; set; }  
     public string Url { get; set; }  
     public string Tags { get; set; }  
     public virtual ICollection<Post> Posts { get; set; }  
}

Das verzögerte Laden der Posts-Auflistung kann deaktiviert werden, indem die Posts-Eigenschaft als nicht virtuell festgelegt wird.

wenn das verzögerte Laden deaktiviert ist, kann das Laden der Posts-Auflistung weiterhin mithilfe des eifrigen Ladens (mithilfe der Include-Methode) oder des expliziten Ladens verwandter Entitäten (mithilfe der Load-Methode) erreicht werden.

Eifrig laden:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

Explizit laden:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 
}
58
Parsa