1

我在實體框架理解延遲加載有問題5.使用延遲加載相關的實體時,我明白不加載,直到請求:實體框架5的延遲加載和提琴手

「當使用延遲加載,你最初的查詢不僅帶來目標 實體集,但每當你訪問一個導航屬性,另一個 查詢發出了對店裏來加載相關實體。 (reference)」

我有一個的ASP.NET Web有兩類API項目:

public class Farm 
{ 
    public int FarmId { get; set; } 
    public virtual ICollection<LandUnit> LandUnits { get; set; } 
    ... 
} 
public class LandUnit 
{ 
    public int LandUnitId { get; set; } 
    ... 
} 

我設置LazyLoadingEnabled = true,並且有我遵循的準則(reference)POCO類,但是當我用腳手架創建FarmController並調用它通過小提琴手,它表明:

JSON 
    {} 
     ... 
    LandUnits 
     {} 
      ... 

如果我設置LazyLoadingEnabled =假,然後我得到:

JSON 
    {} 
     ... 
    LandUnits=(null) 

我誤解延遲加載的基本知識?在我看來,發生的事情與定義所說的相反。當延遲加載關閉時,相關實體不會被加載。當延遲加載時,加載相關的實體。

回答

2

這是預期的行爲。當JSON序列化程序將序列化類型時,它將枚舉LandUnits導航屬性,該屬性當然會從數據庫中調用該集合的延遲加載。

當您切換延遲加載時,您的導航屬性仍將被設置爲其默認值,如演示,因爲實體框架不會生成代理類型。

我建議保持延遲加載關閉和熱切(使用Include方法)或明確加載(使用Load方法)相關數據,以確保您不會無意加載不需要的數據。

使用默認JSON序列化程序時,您還應該知道circular dependency problems

+0

感謝偉大的反應!因此,當LazyLoadingEnabled = true時,api調用首先抓取Far​​m記錄(發出第一個SQL查詢),然後JSON序列化程序序列化結果以抓取LandUnits記錄(發出第二個SQL查詢)? – brudert

+0

是的,這是正確的 – devdigital

0

這只是說明你還沒有要求任何LandUnit(如果你使用類似foreach的東西來遍歷它們,它們將被加載)。所以在使用延遲加載時JSON對象是空的。

當懶加載關閉,LandUnits對象作爲LandUnits沒有被加載,並且不能在以後的時間被加載爲空(試圖這樣做會引發錯誤)