实体框架延迟加载

时间:2011-09-18 12:31:24

标签: c# .net linq entity-framework code-first

我有两个实体:

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; }
    }

我应该如何加载所需的字段?

由于

2 个答案:

答案 0 :(得分:2)

也许你的映射定义有问题。你能在你的分类表上做一个GetAll吗?您的Product.Category属性是否知道要用于Category表的外键?

文章Using DbContext in EF 4.1 Part 6: Loading Related Entities解释了以急切或懒惰模式加载实体的不同方法。

当您使用context.Configuration.LazyLoadingEnabled = false时,您正在定义加载实体的全局方式,但如果您愿意,您可以通过执行以下操作具体说明应如何加载每个属性:

  • 懒惰加载示例:public virtual Category Category { get; set; }
  • 急切加载示例:public Category Category { get; set; }

因此,如果它不起作用,我会检查您的映射定义,然后检查发送到您的数据库的SQL查询。您将确切地看到sql查询是否包含您的类别详细信息。

我知道2个选项可以看到生成的sql。您可以监控数据库或使用Mvc Mini Profiler。如果您使用的是DevArt dotConnect,那么您就拥有了一个监控工具。

答案 1 :(得分:2)

我刚尝试以这样的方式获取Product对象:

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

和类别也已加载。这是可能的解决方案。但有趣的是,当我使用第一个

时,为什么类别为空