簡體   English   中英

在EF Core中加載對象引用集合的正確方法是什么?

[英]What is the correct way to load a collection of a reference of an object in EF 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()簡單地加載另一個對象並以正常方式調用.Include() ,還有什么可以實現我想要做的事情嗎?

您可以(1)使用Query方法(可用於參考和集合導航屬性),並且(2)將它與熱切的加載方法( Include / ThenInclude )結合使用,例如

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

首先,我認為您應該將導航屬性標記為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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM