在 EF Core 中加载对象引用集合的正确方法是什么?

Dev*_*v X 3 c# asp.net entity-framework entity-framework-core

采取以下措施:

public class ClassA
{
    public int ID { get; set; }
    public ICollection<ClassB> ClassBs { get; set; }
    public bool ChangeMe { get; set; }
}

public class ClassB
{
    public int ID { get; set; }
    public string test { get; set; }
    public bool bar { get; set; }
    public ClassA ClassA { get; set; }
    public int ClassAID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我加载了一个 ClassB 对象,我想运行一些代码来执行一些操作,然后将 bar 更改为 true。

完成此操作后,如果 A 类的 ClassBs 集合中的每个 ClassB 都有 true,我想将 ClassA 的 ChangeMe 更改为 true。

因此,如果我将一个 ClassB 加载到名为 的对象中bla,我会尝试以下操作:

if (bla.ClassA.ClassBs.Where(x => x.bar == false).Count() == 0)
{
    Do Something
}
Run Code Online (Sandbox Code Playgroud)

然而,尽管有大量应该加载的 ClassB 对象,但根据当地人的说法,我拥有的唯一一个是当前的,而且它似乎Do Something意外地发生了。

我已经尝试过以下方法:

_context.Entry(bla).Reference(x => x.ClassA).Load()
_context.Entry(bla).Collection(x => x.ClassA.ClassBs).Load()
_context.Entry(bla.ClassA).Collection(x => x.ClassBs).Load()
Run Code Online (Sandbox Code Playgroud)

还有一些,但是,我似乎遇到了各种不同的异常。

除了简单地加载另一个对象并.Include()以正常方式调用之外,还有什么办法可以实现我想要做的事情吗?

Iva*_*oev 6

您可以 (1) 使用Query方法(可用于引用和集合导航属性)并 (2) 将其与急切加载方法 ( Include/ ThenInclude) 结合使用,例如

_context.Entry(bla).Reference(x => x.ClassA)
    .Query() // <-- (1)
    .Include(x => x.ClassBs) // <-- (2)
    .Load();
Run Code Online (Sandbox Code Playgroud)