2016-07-07 37 views
0

ich wieder die folgenden zwei Klassen haben, die von meinem Test-Modell erzeugt werden:Lazy Loading in EF funktioniert nicht

public partial class House 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public House() 
    { 
     this.Persons = new HashSet<Person>(); 
    } 

    public int id { get; set; } 
    public string street { get; set; } 
    public string city { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Person> Persons { get; set; } 
} 


public partial class Person 
{ 
    public int id { get; set; } 
    public string namen { get; set; } 
    public int house { get; set; } 

    public virtual House House1 { get; set; } 
} 

Im Konstruktor meines DbContext ich Lazy Loading-explizit aktivieren, was sollte nicht einmal sein erforderlich:

 this.Configuration.LazyLoadingEnabled = true; 
     this.Configuration.ProxyCreationEnabled = true; 

Später nenne ich eine Liste der Häuser:

 YardEntities cx = new YardEntities(); 
     IList<House> hl = cx.Houses.ToList<House>(); 
     House h = hl[0]; 
     ///**************BREAKPOINT*******************/// 
     Person g = h.Persons.First<Person>(); 
     output = g.namen; 

Nach dem deutlichen b reakpoint Ich habe erwartet, dass alle Personen mit den Häusern verbunden sind nicht geladen an diesem Punkt wegen Lazy Loading. Ich habe nicht auf eine einzelne Person zugegriffen, also warum sollten sie geladen werden? Sie werden jedoch geladen, weil mein Debugger mir alle Namensattribute anzeigt.

Kann jemand dieses Verhalten erklären? Warum funktioniert Lazy nicht?

+0

ich denke, weil Sie eine .. cx.Houses.ToList () verwenden; mach keine toList() und du wirst keine Daten bekommen – lordkain

+0

Nein - das ist das offizielle Tutorial und es verwendet auch tolist() http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext .aspx – David

+0

um mich zu vergnügen, versuchen Sie ohne den Tolist – lordkain

Antwort

3

Ich habe nicht auf eine einzelne Person zugegriffen, also warum sollten sie geladen werden?

Sie haben Recht. Lazy Loading lädt keine Relation, es sei denn, Sie möchten Zugriff ihnen.

aber sie geladen werden, weil mein Debugger mir zeigt, die alle Namen zuschreibt.

gut hier eigentlich Ihre Debugger will Zugang sie wird so faul Laden die Arbeit machen und sie aus der Datenbank erhalten.

+0

ah okay. Nun, wenn das stimmt, ist es in Ordnung. – David

+0

Ja, es ist wahr. Wenn Sie bestätigen möchten, dass Lazy Loading funktioniert wie erwartet, versuchen Sie [Protokollierung der Datenbank-Operationen] (https://msdn.microsoft. com/de-us/data/dn469464.aspx), um zu bestätigen, dass die Beziehung erst beim ersten Zugriff geladen (abgefragt) wird. – sstan

+0

Okay, ich habe das versucht und kann bestätigen, dass es zu 100% wahr ist. Danke, dass meine Frage beantwortet hat . – David

0

Wenn ich nicht verwenden ToList():

 DbSet<House> hl = cx.Houses; 
     House h = hl.FirstOrDefault<House>(); 

h enthält alle Personen, auch wenn ein träges Laden aktiviert ist. Ich denke, dass Arvins Antwort wahr sein muss. Der Debugger lädt alle Werte, wenn ich sie sehen möchte. Aber gibt es eine Möglichkeit, seine Vermutung zu beweisen?