再次:EF 5代码首先渴望与延迟加载

时间:2013-06-19 16:26:10

标签: entity-framework lazy-loading eager-loading

关于急切/延迟加载有很多问题,但仍然有一点我不清楚。我非常了解差异,了解“虚拟”关键字以及如何防止延迟加载。

我有一个非常简单的模型: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 =&gt; pc.Product)“)。如果这是正确的理解,我怎样才能防止将产品附加到类别?我想要的只是产品及其类别,而不是产品清单中的类别。

1 个答案:

答案 0 :(得分:1)

据我所知,你无法阻止(所谓的“关系修正”)。但是你为什么要阻止呢?

您的理解是正确的:

  

“...自动将已加载的产品附加到   种类...“。

此处“已加载”包含具有相同上下文和当前查询结果的早期(跟踪)查询的结果。

运行的查询没有任何含义。查询执行您指定的操作:加载包括类别的产品(DB中的单个JOIN)。该查询没有将这些类别链接到所有相关产品的其他JOIN。关系修复仅在具有附加对象的内存中发生,因此不会导致不必要的查询开销。对于急切和延迟加载,此行为是相同的。