繁体   English   中英

实体框架延迟加载

[英]Entity Framework lazy load

我有两个实体:

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

我应该如何加载必填字段?

谢谢

也许您的映射定义有问题。 您可以在类别表上执行GetAll吗? 您的Product.Category属性是否知道用于Category表的哪个外键?

在EF 4.1第6部分中使用DbContext的文章:加载相关实体解释了在急切或惰性模式下加载实体的不同方法。

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

  • 延迟加载的示例: public virtual Category Category { get; set; } public virtual Category Category { get; set; }
  • 急切加载的示例: public Category Category { get; set; } public Category Category { get; set; }

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

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

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

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

和类别也被加载。 这是可能的解决方案。 但是有趣的是为什么我第一次使用时类别为空

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM