当链接表(和类)存在时,如何加载实体的子集合?

时间:2017-10-19 13:17:30

标签: c# entity-framework linq entity-framework-6 linq-to-entities

我的多对多关系需要链接表中的有效负载数据(权重字段)。

public class Formula
{
    public int ID { get; set; }
    ...
    public virtual ICollection<FormulaComponent> FormulaComponents { get; set; }
}

public class Component
{
    public int ID { get; set; }
    ...
    public virtual ICollection<FormulaComponent> FormulaComponents { get; set; }
}

public class FormulaComponent
{
    [Key, Column(Order = 0)]
    public int FormulaID { get; set; }

    [Key, Column(Order = 1)]
    public int ComponentID { get; set; }

    [ForeignKey("FormulaID")]
    public virtual Formula Formula { get; set; }

    [ForeignKey("ComponentID")]
    public virtual Component Component { get; set; }

    public double? Weight { get; set; }
}

我正在努力学习如何使用linq为父实体(特定公式的组件)加载子数据。我的代码在需要有效载荷数据之前工作。当我没有代表链接表的类而子元素是父元素(ICollection<Component>)的属性时,这是我在断开连接的场景中加载子数据的方式:

_context.Entry(Formula).Collection(f => f.Components).Load();

由于子集合不再是父集的属性,我尝试了这个:

_context.Entry(Formula).Collection(f => f.FormulaComponents).Load();

但是只获取链接表数据。由于组件是链接表的属性,我怀疑我需要添加Select或SelectMany但我无法正确使用语法:

_context.Entry(Formula).Collection(f => f.FormulaComponents.Select(???)).Load();

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

很抱歉,目前我无法测试解决方案,但可能会有效。

_context.Entry(Formula).Collection(f => f.FormulaComponents).Load();
_context.Entry(Formula.FormulaComponents).Reference(fc => fc.Component).Load();

因为您的关系表( FormulaComponent )中有属性多对多关系(公式 - 组件)实际上有一个一对多 Formula - FormulaComponent )和一个多对一 FormulaComponent - Component )关系。 因此,您必须首先加载集合(FormulaComponent),然后加载集合中每个条目对Component的引用。

如果有效,请告诉我。

答案 1 :(得分:0)

我在这里回答我自己的问题。我没有意识到子组件实体与FormulaComponents一起急切加载。所以这行代码(在问题中)确实有效:

_context.Entry(Formula).Collection(f => f.FormulaComponents).Load();

所以,当我说“但只获得链接表数据”时,我实际上是错的。它正好加载我想加载的内容。