2011-09-18 116 views
2

我有兩個實體:實體框架延遲加載

public class Product 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int ProductID { get; set; } 

     [Required(ErrorMessage="Please enter a product name")] 
     public string Name { get; set; } 

     [Required(ErrorMessage = "Please enter a description")] 
     [DataType(DataType.MultilineText)] 
     public string Description { get; set; } 

     [Required] 
     [Range(0.01,double.MaxValue,ErrorMessage="Please enter positive price")] 
     public decimal Price { get; set; } 

     public Category Category { get; set; } 

     [HiddenInput(DisplayValue= false)] 
     public string ImageFileName { get; set; } 

     [HiddenInput(DisplayValue = false)] 
     public string ImageMimeType { get; set; } 

    } 

public class Category 
    { 
     [HiddenInput(DisplayValue=false)] 
     public int CategoryID { get; set; } 

     [Required(ErrorMessage="Please enter a category name")] 
     public string Name { get; set; } 

     [Required(ErrorMessage = "Please enter a description")] 
     [DataType(DataType.MultilineText)] 
     public string Description { get; set; } 


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

     [HiddenInput(DisplayValue= false)] 
     public string ImageFileName { get; set; } 

     [HiddenInput(DisplayValue = false)] 
     public string ImageMimeType { get; set; } 
    } 

當我試圖讓產品這樣

Product product = repository.Products.FirstOrDefault(p => p.ProductID == id); 

類別字段爲空。

沒有product.Category.Load()和repository.Products.Include(「Category」)...方法。

context.Configuration.LazyLoadingEnabled = false; 

不會影響。 上下文是隔壁班

public class EFDbContext:DbContext 
    { 
     public DbSet<Product> Products { get; set; } 
     public DbSet<Category> Categories { get; set; } 
    } 

的目標我應該如何加載需要的領域?

謝謝

+0

我剛剛嘗試以這種方式獲取產品對象: Product product =(from repository.Products.Include中的p「Category」)其中p。 ProductID == id select p).SingleOrDefault(); 和類別也被加載。這是可能的解決方案。但有趣的是,爲什麼類別爲空時,我使用第一種方式 – xwrs

回答

2

我剛纔想獲取Product對象這樣的方式:

Product product = (
    from p in repository.Products.Include("Category") 
    where p.ProductID == id 
    select p 
).SingleOrDefault(); 

和裝載類了。這是可能的解決方案。但有趣的是,爲什麼類別爲空時,我第一次使用

+0

這不是延遲加載,對不對? – Elaine

2

也許你的映射定義有問題。你能在你的分類表上做一個GetAll嗎?您的Product.Category屬性是否知道用於Category表的哪個外鍵?

文章Using DbContext in EF 4.1 Part 6: Loading Related Entities解釋了不同的方式來加載你的實體在急切或懶惰模式。

當您使用context.Configuration.LazyLoadingEnabled = false,你所定義的全球方式加載實體,但如果你願意,你可以告訴specificly了每個屬性應該通過這樣做來加載:

  • 舉例裝載:public virtual Category Category { get; set; }
  • 示例急切裝載public Category Category { get; set; }

所以,如果它不適合你,我會檢查你的映射定義,然後檢查發送到你的數據庫的sql查詢。你會看到確切的SQL查詢是否包含你的類別細節。

我知道2個選項來查看生成的SQL。您可以監視您的數據庫或使用Mvc Mini Profiler。如果您正在使用DevArt dotConnect,則只需要一個監控工具。

相關問題