2014-03-30 2 views
5

Es ist mein Verständnis, dass, wenn ich faul Laden in meiner EF6 Anwendung verwenden möchte, sollte ich Code meine Beziehungen wie dies mit den letzten beiden Punkte als virtuelle markiert:Wenn ich lazy loading auf false gesetzt habe (vorerst), ist es dann wichtig, ob ich das "virtuelle" Schlüsselwort einfüge oder es auslasse?

public class Test 
{ 
    public int TestId { get; set; } 
    public int ExamId { get; set; } 
    public string Title { get; set; } 
    public int Status { get; set; } 
    public System.DateTime CreatedDate { get; set; } 
    public virtual Exam Exam { get; set; } 
    public virtual ICollection<UserTest> UserTests { get; set; } 
} 

Wenn ich will nicht faul Laden verwenden (im Moment) und wenn ich die Lazyloading-Konfiguration auf "false" setze, gibt es irgendwelche Leistungsüberlegungen, wenn ich das virtuelle Schlüsselwort belasse oder sollte ich meine Klasse ohne das Schlüsselwort so schreiben?

public class Test 
{ 
    public int TestId { get; set; } 
    public int ExamId { get; set; } 
    public string Title { get; set; } 
    public int Status { get; set; } 
    public System.DateTime CreatedDate { get; set; } 
    public Exam Exam { get; set; } 
    public ICollection<UserTest> UserTests { get; set; } 
} 

Der Grund Ich frage das ist ich Flexibilität im virtual Stichwort, indem sie halten mag, aber nur, wenn das wird Problem für mich nicht verursachen, wenn ich faul Laden bin nicht verwenden.

Ich las die folgenden

„, wenn Sie das virtuelle Schlüsselwort auf einem ICollection/one-to-many-Beziehung Eigenschaft verwenden, wird es standardmäßig faul belastet sein, während, wenn Sie das Schlüsselwort virtual auslassen Es wird eifrig geladen sein. "

Ist das wahr, auch wenn ich DbContext.Configuration.LazyLoadingEnabled = false; einstelle?

+0

Wenn Sie es einstellen, wird das eifrige Laden durchgeführt. Und virtuelles Schlüsselwort bedeutet anders ich denke –

+0

Was meinst du "wenn du es einstellst"? – Melina

+0

Wenn Sie lazyloadingenabled auf false setzen –

Antwort

4

Das virtual Schlüsselwort ist es nur möglich, dass eine abgeleitete Klasse kann zur Laufzeit dynamisch erstellt werden, die die Eigenschaften außer Kraft setzt, die als virtual um markiert sind einige Datenzugriffscode einzuschleusen ("Vertreter"). Aber wenn Sie LazyLoadingEnabled = false setzen, sagen Sie Entity Framework "Überschreibe meine Entity-Klasse nicht mit einem Lazy-Lade-Proxy". In diesem Fall hat das Schlüsselwort virtual keine Auswirkung. (Nun, ich kann nicht sagen, welche Kosten die Instanziierung eines Objekts mit virtual Eigenschaften oder Methoden aus der .NET CLR-Sichtweise verursacht. Es hat wahrscheinlich einige Kosten, aber ich bin mir sicher, dass es fast nichts im Vergleich zum tatsächlichen Zugriff auf die Datenbank ist.)

Also, Ihre Vorgehensweise zum Markieren von Eigenschaften als virtual offen für mögliche Lazy Loading in der Zukunft ist meiner Meinung nach in Ordnung.

BTW: Dies - während, wenn Sie das virtuelle Schlüsselwort aus, wird es eifrig geladen werden - ist falsch. Wenn Sie das Lazy Loading deaktivieren, indem Sie entweder das Schlüsselwort virtual weglassen oder LazyLoadingEnable = false setzen, wird das Laden von E-Mails standardmäßig nicht gestartet. Stattdessen erhalten Sie überhaupt kein Laden (von Navigationseigenschaften). Eager Loading muss explizit mit Include oder mithilfe von Projektionen codiert werden.

Nur um es zu erwähnen: Sie können auch den Modifikator virtual später hinzufügen, wenn Sie es brauchen. Und Sie können es auf bestimmte Entitäten beschränken. EF betrachtet dies nicht als Modelländerung, die das Datenbankschema irgendwie berühren würde.

2

Wenn Sie LazyLoadingEnabled = False festlegen. Es wird nicht auf Lazy Loading auswirken, auch wenn Sie virtuelles Schlüsselwort enthalten.

virtuelle arbeitet zusammen mit zwei Eigenschaften von DbContext.Configuration:

  • ProxyCreationEnabled

[MSDN] Ruft einen Wert ab, der angibt, ob der Rahmen wird Instanzen erstellen, dynamisch generierte Proxy-Klassen, wenn sie eine Instanz eines Entitätstyps

erstellt
  • LazyLoadingEnabled
Verwandte Themen