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

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

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

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

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

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

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

Более того, я подключил 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; }
}

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

Еще один момент, который иногда может быть причиной, заключается в том, что один из них забывает добавить виртуальный модификатор в свойство навигации




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