16

Rozważmy Person i Address klasy zdefiniowane jakoW Entity Framework, dlaczego nie jest leniwe ładowanie działające dla właściwości nawigacyjnej jeden do zera lub jeden?

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; } 
} 

gdzie tylko niektóre osoby mają adresu, ale wszystkie adresy mają osobę. Jest to one-to-zero-or-one relationship, więc skonfigurować go jako

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

Teraz w moim kodu następujące podejście (chętni loading) działa perfekcyjnie.

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

Jednak następujące podejście (leniwe ładowanie) nie powoduje.

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

Ponadto ja podłączyć SQL Profiler i widzę, że nie jest nawet EF próby leniwy obciążenia adres w drugim przypadku - po prostu zwraca null.

Nie udało mi się zlokalizować żadnej dokumentacji, która mówi, że EF nie leniwie ładuje właściwości nawigacji od jednego do zera lub jednego. Czy jest to zgodne z projektem, czy jest to błąd, czy też robię coś nie tak?

Przetestowałem to zarówno z Entity Framework 5, jak i Entity Framework 6 Alpha 3 i otrzymałem te same wyniki.

+1

Działa u mnie. Czy jesteś pewien, że 'ProxyCreationEnabled' i' LazyLoadingEnabled' są prawdziwe dla kontekstu? –

Odpowiedz

23

Wymyśliłem to. Klasy encji muszą być zadeklarowane jako public i właściwości public virtual dla leniwego ładowania do pracy. To znaczy.

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

Też natknąłem się na ten problem. Czy udało Ci się znaleźć jakąś dokumentację na ten temat? – ironic

+1

Nie, niestety nie. Wyjaśniałem to przez próbę i błąd. – Mike

+0

Jest to dość oczywiste ze względu na dynamiczne proxy, ale nie zauważyłem tego również i musiałem je wyszukać. Dzięki twojej odpowiedzi tutaj działa teraz;) – julealgon

1

Kolejnym punktem, który może być również powodem czasami jest, jeśli ktoś zapomni dodać wirtualny modyfikator do właściwości nawigacji

0

Jeśli używasz bazy pierwsze podejście, upewnij się, że Lazy Loading Włączone nieruchomość Prawdziwe. Możesz znaleźć tę właściwość we właściwościach diagramu EDMX.

Można również zmienić to zachowanie, ustawiając dbcontext.Configuration.LazyLoadingEnabled = true gdzie dbcontext jest instancją DbContext.

Powiązane problemy