在實體框架中,為什麼延遲加載不適用於一對一或一個導航屬性?

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

考慮定義為的PersonAddress

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事件探查器,我可以看到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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因