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

时间:2019-06-24 01:45:20

标签: 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; }
}

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

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

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

if (bla.ClassA.ClassBs.Where(x => x.bar == false).Count() == 0)
{
    Do Something
}

但是,尽管有很多应该加载的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()

还有更多,但是,我似乎得到了各种不同的例外。

简单地加载另一个对象并以正常方式调用.Include()的简短方式,是否有实现我想要做的事情的地方?

2 个答案:

答案 0 :(得分:2)

您可以(1)使用Query方法(可用于参考和集合导航属性),并且(2)可以将它与热切的加载方法(Include / ThenInclude)结合使用,例如

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

答案 1 :(得分:0)

首先,我认为您应该将导航属性标记为virtual

 public class ClassA
{
    public int ID { get; set; }
    public virtual 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 virtual ClassA ClassA { get; set; }
    public int ClassAID { get; set; }
}

,然后使用IncludeThenInclude的链条

    var bla = _context.Set<ClassB>().Include(cb=>cb.ClassA).ThenInclude(ca=>ca.ClassBs).ThenInclude(cb=>cb.ClassA).Where(x=>x.Id=blaId)
if (bla.ClassA.ClassBs.Where(x => x.bar == false).Count() == 0)
{
   Do Something
}