延迟加载子实体集合

Lazy load sub entity collection

我有一个产品实体和一个 child 产品实体:

public class Product
{
    public virtual ICollection<ProdAttribute> Attributes { get; set; }
    public virtual ICollection<ChildProduct> Children { get; set; }
    public string ItemID { get; set; }
    public string ItemName { get; set; }
}

public class ChildProduct
{
    public virtual ICollection<ProdAttribute> Attributes { get; set; }
    public int DisplayOrder { get; set; }
    public string ItemID { get; set; }
    public string ItemName { get; set; }
    public virtual Product Parent { get; set; }
    public string ParentItemID { get; set; }
    public string Size { get; set; }
}

在我的上下文中,我只是使用以下方法获取产品及其 children:

        return _axaptaContext.Products
            .Include(x => x.Children)
            .Include(x => x.Attributes);

现在我希望 children 也包含属性,所以我尝试使用

        return _axaptaContext.Products
            .Include(x => x.Children)
            .Include("Children.Attributes")
            .Include(x => x.Attributes);

但这会导致查询超时。我如何延迟加载 children 的属性,就像我尝试调用时一样:

product.Children.Attribtutes

它只是 returns 空。我发现的关于延迟加载的所有内容都表明,如果我将属性标记为虚拟

,则它们应该被延迟加载

首先,您不需要调用 .Include("Children.Attributes")lazy 加载,而是 eager 加载实体。

只需确保您已将上下文对象的 LazyLoadingEnabled & ProxyCreationEnabled 设置为 true。现在,当您在 属性 sql 上调用 get 来获取实体时,实体将自动被触发,您将填充对象。

context.Configuration.ProxyCreationEnabled = true;
context.Configuration.LazyLoadingEnabled = true;

注意:属性你要延迟加载需要是虚拟的。