2013-06-19 84 views
1

關於急切/懶惰加載有很多問題,但仍然有一點不明白。我非常瞭解這種差異,瞭解「虛擬」關鍵字以及如何防止延遲加載。再一次:EF 5代碼首先渴望與懶惰加載

我有一個非常簡單的模型:Store,Product,ProductCategory。商店可以有很多產品和類別,產品必須屬於商店並且必須有一個類別。爲了讓事情變得更簡單,我在ProductCategory中聲明瞭一個「Products」屬性,以便按需獲得屬於一個類別的所有產品。這裏是我的課程:

public class Store 
{ 
    public Store() 
    { 
     this.Product = new HashSet<Product>(); 
     this.ProductCategory = new HashSet<ProductCategory>(); 
    } 

    [Key] 
    public int Id { get; set; } 

    [Required()] 
    public string Name { get; set; } 

    public ICollection<Product> Product { get; set; } 
    public ICollection<ProductCategory> ProductCategory { get; set; } 
} 

public class Product 
{ 
    [Key] 
    public int Id { get; set; } 

    public int StoreId { get; set; } 

    [Required()] 
    public Store Store { get; set; } 

    [Required()] 
    [MaxLength(50)] 
    public string Name { get; set; } 

    public int ProductCategoryId { get; set; } 

    [Required()] 
    public ProductCategory ProductCategory { get; set; } 

} 

public class ProductCategory 
{ 
    public ProductCategory() 
    { 
     this.Product = new HashSet<Product>(); 
    } 

    [Key] 
    public int Id { get; set; } 

    public int StoreId { get; set; } 

    [Required()] 
    public Store Store { get; set; } 

    public string Name { get; set; } 

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

} 

在我的上下文中,我設置Configuration.LazyLoadingEnabled = false。什麼是不明確的是以下查詢的結果:

var product = context.Products.Include(p => p.ProductCategory).Single(p => p.Id == 1); 

結果是:一個產品(預期),連接到產品(預期)一類,也附着類別的一個產品(不預期)。 據我瞭解EF 5是如何工作的,它首先加載產品,然後加載類別,然後將已加載的產品「自動」附加到類別實體,即使我沒有告訴EF做這件事(沒有「包括(pc => pc.Product)「)。如果這是正確的理解,我該如何防止將產品附加到該類別?我要的只是產品及其類別,而不是產品列表中的類別。

回答

1

據我所知,你不能防止(所謂的「關係修復」)。但爲什麼你想要阻止它?

你的理解是正確的:

「......可自動將已經加載產品(第)到 種類...」。

此處「已經加載」包括從具有相同上下文和當前查詢的結果較早(跟蹤)查詢的結果。

對於運行的查詢沒有任何含義。該查詢執行您指定的操作:加載包括類別的產品(單個JOIN在數據庫中)。查詢沒有額外的JOIN,將這些類別鏈接到全部相關產品。關係修正只發生在具有附加對象的內存中,因此不會導致不必要的查詢開銷。對於急加載和延遲加載,這種行爲是相同的。

+0

感謝您的回答。首先,我只想知道我對EF如何工作的理解是正確的。第二個「我爲什麼要阻止它」是因爲MVC 4中的JSON序列化和遞歸問題。有辦法來處理它,但我想也許有辦法不對待效果(遞歸),但原因。如果EF沒有這樣工作,那麼JSON序列化就不會出現問題。 – okieh