我的多对多关系需要链接表中的有效负载数据(权重字段)。
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();
非常感谢任何帮助。
答案 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();
所以,当我说“但只获得链接表数据”时,我实际上是错的。它正好加载我想加载的内容。