16

Betrachten Person und Address Klassen definiert alsWarum funktioniert in Entity Framework das Laden von Lazy nicht für eine Eins-zu-Null-Navigationseigenschaft?

class Person 
{ 
    public int PersonId { get; set; } 
    public virtual Address Address { get; set; } 
} 

class Address 
{ 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 

wo nur einige Personen eine Adresse haben, aber alle Adressen haben eine Person. Dies ist ein one-to-zero-or-one relationship, so dass ich so konfiguriere, dass als

modelBuilder.Entity<Address>() 
    .HasKey(a => a.PersonId) 
    .HasRequired(a => a.Person) 
    .WithOptional(a => a.Address); 

nun in meinem Code die folgende Vorgehensweise (eager loading) arbeitet völlig in Ordnung.

var person = context.Person 
    .Include(a => a.Address) 
    .Single(a => a.PersonId == 123); 
var address = person.Address; // address != null (correct) 

Der folgende Ansatz (Lazy Loading) nicht jedoch.

var person = context.Person 
    .Single(a => a.PersonId == 123); 
var address = person.Address; // address == null (incorrect) 

Außerdem hakte ich SQL Profiler, und ich kann sehen, dass EF nicht einmal die Adresse im zweiten Fall zu faul Last versucht - es gibt nur null.

Ich konnte keine Dokumentation finden, die besagt, dass EF keine Eins-zu-Null-Navigationseigenschaften lädt. Ist das Absicht, ist es ein Fehler, oder mache ich etwas falsch?

Ich testete dies sowohl mit Entity Framework 5 und Entity Framework 6 Alpha 3 und erzielte die gleichen Ergebnisse.

+1

Funktioniert für mich. Sind Sie sicher, dass "ProxyCreationEnabled" und "LazyLoadingEnabled" für den Kontext wahr sind? –

Antwort

23

Ich dachte mir das aus. Die Entitätsklassen müssen als public und die Eigenschaften public virtual für das verzögerte Laden zum Arbeiten deklariert sein. I.e.

public class Person 
{ 
    public int PersonId { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 
+0

Ich bin auch auf dieses Problem gestoßen. Haben Sie eine Dokumentation gefunden? – ironic

+1

Nein, leider nicht. Ich habe es durch Versuch und Irrtum herausgefunden. – Mike

+0

Das ist etwas offensichtlich wegen des dynamischen Proxy-Zeugs, aber ich habe es auch nicht bemerkt und musste danach suchen. Dank Ihrer Antwort funktioniert es jetzt;) – julealgon

1

Ein weiterer Punkt, der auch der Grund, manchmal sein könnte, ist, wenn man den virtuellen Modifikator auf die Navigationseigenschaft

0

Wenn Sie mit Database ersten Ansatz hinzuzufügen vergisst, stellen Sie sicher, dass Lazy Loading-Enabled-Eigenschaft ist Wahr. Sie finden diese Eigenschaft in den Eigenschaften des EDMX-Diagramms.

Sie können das Verhalten auch außer Kraft setzen, indem Sie dbcontext.Configuration.LazyLoadingEnabled = true festlegen, wobei dbcontext die Instanz von DbContext ist.