Я смотрел Применение фильтров при явной загрузке связанных объектов и не мог заставить его работать для отношения "многие ко многим".
Я создал простую модель:
Краткое описание:
A Student
может принимать много Courses
, а Course
может иметь много Students
.
A Student
может сделать много Presentation
, но a Presentation
может быть сделано только одним Student
.
Итак, у нас есть отношение "много-ко-многим" между Students
и Courses
, а также отношение "один ко многим" между Student
и Presentations
.
Я также добавил один Student
, один Course
и один Presentation
, связанные друг с другом.
Вот код, который я запускаю:
class Program
{
static void Main()
{
using (var context = new SportsModelContainer())
{
context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;
Student student = context.Students.Find(1);
context.
Entry(student).
Collection(s => s.Presentations).
Query().
Where(p => p.Id == 1).
Load();
context.
Entry(student).
Collection(s => s.Courses).
Query().
Where(c => c.Id == 1).
Load();
// Trying to run Load without calling Query() first
context.Entry(student).Collection(s => s.Courses).Load();
}
}
}
После загрузки презентаций я вижу, что счетчик для Presentations
изменился с 0 на 1: . Однако после выполнения этого же с Courses
ничего не меняется:
Поэтому я пытаюсь загрузить курсы без вызова Query
и работает как ожидалось:
(Я удалил предложение Where
, чтобы еще больше выделить точку - последние две попытки загрузки различаются только по вызову "Query()"
Теперь единственное различие, которое я вижу, состоит в том, что одна связь является "один ко многим", а другая - "ко многим". Это ошибка EF, или я чего-то не хватает?
И btw, я проверил вызовы SQL для двух последних попыток Course
-loading, и они на 100% идентичны, поэтому кажется, что EF не заполняет коллекцию.