關於急切/懶惰加載有很多問題,但仍然有一點不明白。我非常瞭解這種差異,瞭解「虛擬」關鍵字以及如何防止延遲加載。再一次: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)「)。如果這是正確的理解,我該如何防止將產品附加到該類別?我要的只是產品及其類別,而不是產品列表中的類別。
感謝您的回答。首先,我只想知道我對EF如何工作的理解是正確的。第二個「我爲什麼要阻止它」是因爲MVC 4中的JSON序列化和遞歸問題。有辦法來處理它,但我想也許有辦法不對待效果(遞歸),但原因。如果EF沒有這樣工作,那麼JSON序列化就不會出現問題。 – okieh