Это все о коллекциях, которые помечены как загруженные или нет.
Линия
foundRooms.ToList();
(или foundRooms.Load()
)
загружает все Room
s и их ContactRoomRoles
коллекции в контексте.Поскольку используется оператор Include
, эти коллекции помечаются как загруженные EF.Вы можете проверить это, посмотрев на
context.Entry(Rooms.Local.First()).Collection(r => r.ContactRoomRoles).IsLoaded
, который должен вернуть true
.
Если вы опустите строку foundRooms.ToList();
, каждый раз, когда к коллекции Room.ContactRoomRoles
обращаются, EF будетобратите внимание, что он еще не помечен как загруженный и будет загружен ленивым.После этого коллекция помечается как загруженная, но потребовался дополнительный запрос.
Коллекция помечается как загруженная только в том случае, если она является -
Include
-ed - загружается с помощью отложенной загрузки
загружается с помощью оператора Load()
, как в
context.Entry(Rooms.Local.First()).Collection(r => r.ContactRoomRoles).Load();
Не, когда он является частью проекциив другое свойство (например, часть ContactRoomRoles = rm.ContactRoomRole
в вашем запросе).
Однако после оператора var roomsData = foundRooms (...).ToList()
все Room.ContactRoomRoles
заполнены , поскольку запрос действительно загрузил их вв контексте, а EF всегда выполняет процесс исправления отношений , который автоматически заполняет свойства навигации.
Итак, чтобы подвести итог, после запроса у вас есть roomsData
, содержащий объекты комнаты с ContactRoomRoles
коллекции, которые заполнены , но не помечены как загружены .
Зная это, теперь очевидно, что единственное, что нужно сделать, - это предотвратить отложенную загрузку.
Лучший способ добиться этого - предотвратить создание сущности EFобъекты, способные к отложенной загрузке, известные как прокси .Вы делаете это, добавляя строку
context.Configuration.ProxyCreationEnabled = false;
чуть ниже оператора using
.
Теперь вы заметите, что строка
var numberOfRoles1 = roomsData.ElementAt(1).Room.ContactRoomRoles.Count();
невызвать дополнительный запрос, но возвращает правильное количество.