关于急切/延迟加载有很多问题,但仍有一点我不清楚。我很清楚其中的区别,了解“虚拟”关键字以及如何防止延迟加载。
我有一个非常简单的模型:商店、产品、产品类别。一个商店可以有很多产品和类别,一个产品必须属于一个商店并且必须有一个类别。为了让事情变得更简单,我在 ProductCategory 中声明了一个“产品”属性,这样我就可以按需获取属于一个类别的所有产品。这是我的课程:
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 => pc.Product)")。如果这是正确的理解,我该如何防止将产品附加到类别?我想要的只是产品及其类别,而不是带有产品列表的类别。