关于急切/延迟加载有很多问题,但仍然有一点我不清楚。我非常了解差异,了解“虚拟”关键字以及如何防止延迟加载。
我有一个非常简单的模型: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)“)。如果这是正确的理解,我怎样才能防止将产品附加到类别?我想要的只是产品及其类别,而不是产品清单中的类别。
答案 0 :(得分:1)
据我所知,你无法阻止(所谓的“关系修正”)。但是你为什么要阻止呢?
您的理解是正确的:
“...自动将已加载的产品附加到 种类...“。
此处“已加载”包含具有相同上下文和当前查询结果的早期(跟踪)查询的结果。
运行的查询没有任何含义。查询执行您指定的操作:加载包括类别的产品(DB中的单个JOIN)。该查询没有将这些类别链接到所有相关产品的其他JOIN。关系修复仅在具有附加对象的内存中发生,因此不会导致不必要的查询开销。对于急切和延迟加载,此行为是相同的。