Выбор Entity в свойстве объекта не будет заполнять связанные с ним объекты, несмотря на использование .Include (). Почему это? - PullRequest
0 голосов
/ 06 января 2012

Я использую Entity Framework 4.1 и пытаюсь выбрать сущность, в то же время включая одну из связанных с ней коллекций сущностей.Это стандартный способ сделать это с помощью LINQ.(MacAddressPool один-ко-многим с AllowedPartNumbers.)

var query =
    from p in MacAddressPools.Include( "AllowedPartNumbers" )
    where p.MacAddressPoolID == 2
    select p;

var pool = query.FirstOrDefault();

Console.WriteLine( pool.AllowedPartNumbers.IsLoaded );

"True"

Вместо этого я мог бы захотеть сделать это, чтобы получить другие данные одновременно:

var query =
    from p in MacAddressPools.Include( "AllowedPartNumbers" )
    where p.MacAddressPoolID == 2
    select new 
    {
        Pool = p,
        AssignedMacAddressCount = pool.MacAddressAssignments.Count( a => a.AssignedDate != null )
    };

var pool = query.FirstOrDefault().Pool;

Console.WriteLine( pool.AllowedPartNumbers.IsLoaded );

"False"

Почемуколлекция связанных объектов не загружена на этот раз?Неважно, если я использую анонимный тип или какой-то класс.Он не будет загружать AllowedPartNumbers.Используемая команда SQL даже не присоединяется к таблице AllowedPartNumbers.

Я обнаружил, что могу сделать это:

var query =
    from p in MacAddressPools
    where p.MacAddressPoolID == 2
    select new 
    {
        Pool = p,
        AllowedPartNumbers = p.AllowedPartNumbers,
        AssignedMacAddressCount = pool.MacAddressAssignments.Count( a => a.AssignedDate != null )
    };

var pool = query.FirstOrDefault().Pool;

Console.WriteLine( pool.AllowedPartNumbers.IsLoaded );

"True"

Даже если я просто собираюсь игнорировать это свойство AllowedPartNumbersдля моего анонимного типа наличие этого параметра делает LINQ to Entities заполнять свойство AllowedPartNumbers в самом пуле.Мне даже не нужен .Include ().

Есть ли причина такого странного поведения?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Include() не гарантируется работа в подзапросах и прогнозах.Вы можете найти подробное описание этой проблемы на форуме MSDN и в соответствующем сообщении Шона Вильдермута: Внимание при загрузке в Entity Framework .

0 голосов
/ 06 января 2012

Загрузка связанных объектов по умолчанию установлена ​​на false, поскольку это может привести к очень значительному снижению производительности, подумайте об объекте с коллекцией, содержащей сотни или тысячи элементов, что произойдет, когда вы загрузите этот объект!

Включите отложенную загрузку структуры сущностей, и она будет загружать связанные свойства при доступе (вызывая get of property)

context.ContextOptions.LazyLoadingEnabled = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...