2011-09-18 166 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,则只需要一个监控工具。

相关问题