В Entity Framework почему нет ленивой загрузки, работающей для свойства перехода от одного к ноль-другому?

ef-code-first entity-framework entity-framework-5 entity-framework-6 lazy-loading

Вопрос

Рассмотрите классы Person и Address определенные как

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

где только некоторые лица имеют адрес, но у всех Адресов есть Лицо. Это отношение « один к нулю» или «один» , поэтому я настраиваю его как

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

Теперь, в моем коде, следующий подход (нетерпевая загрузка) работает отлично.

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

Однако следующий подход (ленивая загрузка) не имеет.

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

Более того, я подключил SQL Profiler, и я вижу, что EF даже не пытается ленить загрузить адрес во втором случае - он просто возвращает null.

Я не смог найти какую-либо документацию, в которой говорится, что EF не ленится загружать свойства навигации один-на-один-один-один. Это по дизайну, это ошибка, или я делаю что-то неправильно?

Я проверил это как с Entity Framework 5, так и с Entity Framework 6 Alpha 3 и получил те же результаты.

Принятый ответ

Я понял это. Классы сущностей должны быть объявлены как public а свойства public virtual для ленивой загрузки для работы. Т.е.

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

Популярные ответы

Есть несколько правил для включения или отложенной загрузки:

context.Configuration.ProxyCreationEnabled should be true.
context.Configuration.LazyLoadingEnabled should be true.

Свойство навигации должно быть определено как общедоступное, виртуальное.

Контекст не будет выполнять отложенную загрузку, если свойство не определено как виртуальное.

пример

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext() : base("ProjectConnection")
    {
        Configuration.LazyLoadingEnabled = true;
        Configuration.ProxyCreationEnabled = true;
    }

}

прочитайте больше




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему