Как правильно загрузить коллекцию ссылок на объект в EF Core? - PullRequest
0 голосов
/ 24 июня 2019

Возьмите следующее:

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, и я хочу запустить некоторый код, который выполняет несколько вещей, а затем меняет строку на true.

После того, как ясделали это, если у каждого ClassB в коллекции ClassBs класса A есть истина, я хочу изменить 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 ]

2 голосов
/ 24 июня 2019

Вы можете (1) использовать метод запроса (доступен как для справочных, так и для навигационных свойств коллекции) и (2) комбинировать его с методами быстрой загрузки (Include / ThenInclude), например

_context.Entry(bla).Reference(x => x.ClassA)
    .Query() // <-- (1)
    .Include(x => x.ClassBs) // <-- (2)
    .Load();
0 голосов
/ 24 июня 2019

Сначала я думаю, что вы должны пометить ваши свойства навигации как 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; }
}

и затем используйте цепочку Include и ThenInclude

    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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...