26

我有兩個對象類實體框架代碼優先延遲加載

public class User 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    // Navigation 
    public ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public Guid Id { get; set; } 

    // Navigation 
    public User User { get; set; } 
    public Guid User_Id { get; set; } 

    public string Name { get; set; } 
} 

當我加載使用DataContext的用戶,我得到的產品是空的列表(這是確定)。

如果我添加了「虛擬」關鍵字產品列表,

public virtual ICollection<Product> Products { get; set; } 

當我加載用戶,我得到的產品名單。

這是怎麼發生的?我認爲,「虛擬」關鍵字用於不加載,除非你的實體明確這(使用「包括」語句)

我想我完全搞錯了

+1

你可以使用context.ContextOptions.LazyLoadingEnabled = false;強制上下文不要使用LazyLoading – 2012-07-13 11:22:09

+0

使用dbContext它會是context.Configuration.LazyLoadingEnabled = false;不使用「虛擬」的 – VivekDev 2015-12-25 17:08:56

回答

55

這是錯誤的

「虛擬」關鍵字用於不加載實體,除非你 明確這(使用「包括」語句)

延遲加載意味着實體將被自動加載時您首先訪問集合或導航屬性,並且這將會透明地進行,就好像它們總是裝載父對象一樣。

當您指定要查詢的屬性時,使用「include」按需加載。

存在virtual關鍵字只與延遲加載有關。 virtual關鍵字允許實體框架運行時爲您的實體類及其屬性創建動態代理,並支持延遲加載。如果沒有虛擬,延遲加載將不被支持,並且您在集合屬性上獲得空值。

事實是,您可以在任何情況下使用「包含」,但無需延遲加載,它是訪問收集和導航屬性的唯一方法。

+0

_「延遲加載意味着實體將在第一次訪問集合時自動加載」_這意味着如果我永遠不會訪問user.Products屬性,則產品將不會加載,對嗎? – Catalin 2012-07-13 11:35:53

+0

@RaraituL:對 – abatishchev 2012-07-13 11:44:11

+5

@RaraituL是的,那是對的。在調試時,您實際上**訪問**屬性,並且如果支持延遲加載,則會加載它們。所以你可以使用sql profiler或類似的工具來調試發送到數據庫的實際查詢。 – archil 2012-07-13 11:47:41

4

我猜你quiring爲屬性這對於延遲加載對象而被的EF上下文:

using (var db = new Context()) 
{ 
    var user = db.Users.Where(...); 

    var products = user.Products; // being loaded right away 
} 

試圖離開它:

User user; 
using (var db = new Context()) 
{ 
    user = db.Users.Where(...); 

    // I guess you will need here: 
    // .Include(u => u.Products) 
} 
var products = user.Products; // what error will you get here? 
+0

:User user = db.Users.First();在調試模式下,user.Products爲空。使用「虛擬」關鍵字:User user = db.Users.First();在調試模式下,user.Products是一個產品列表 – Catalin 2012-07-13 11:33:19

+0

@RaraituL:正如archil已經提到的,你必須在Code First方法中使用virtual關鍵字來使延遲加載成爲可能。然後,您可以打開或關閉它。 – abatishchev 2012-07-13 11:45:21

+0

但上下文在「user.Products」之前是「關閉的」,所以如果存在上下文,延遲加載將如何工作? – Nerf 2017-04-21 13:49:44