EF4 Получение ассоциаций в отдельных запросах при использовании POCO - PullRequest
0 голосов
/ 27 января 2012

Я хочу построить граф объектов, используя Entity Framework 4.2.

Прямо сейчас у меня есть объекты POCO, использующие ICollection для свойств навигации.Я хочу избежать использования EntityCollection или чего-либо, связанного с EF.

Я хочу избежать массивных объединений, вызванных чрезмерным использованием Включить.Для данного объекта я хочу заполнить его свойства навигации, что приведет к отдельному запросу к базе данных.

Есть ли способ заполнить ICollection напрямую?Сейчас я работаю над этой проблемой, но это действительно больно.

// grab the user, brand users and brands
User user = entities.Users
                    .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand))
                    .Where(item => item.Name == userName)
                    .SingleOrDefault();
// grab the pending share grants and brands
entities.Users
        .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand))
        .Where(item => item.Id == user.Id)
        .Load();
return user;

Одна вещь, которая мне не нравится в этом подходе, это то, что я повторно запрашиваю объект верхнего уровня.Если я этого не сделаю, свойство навигации не заполняется (остается пустым), когда не возвращаются объекты.Например, следующий код только работает, если возвращаются результаты:

entities.ShareGrants
        .Include(item => item.Brand)
        .Where(item => item.ToUserId == user.Id)
        .Load();

Мне было бы любопытно, если бы был только метод, о котором я не знал в рамках сущности для создания этих типовотношений.Если кто-то знает простой подход к постепенному заполнению свойств навигации, я был бы признателен за пример кода.

Ответы [ 3 ]

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

Ваш вопрос не очень понятен. Почему бы не использовать несколько Include s в одном запросе

User user = entities.Users
      .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand))
      .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand))
      .Where(item => item.Name == userName)
      .SingleOrDefault();
0 голосов
/ 01 августа 2012

Короткий ответ на этот вопрос заключается в том, что EF4 напрямую не поддерживает желаемую функциональность. Чтобы предотвратить массовое объединение и разбить результаты по нескольким вызовам в базу данных, необходимо снова загрузить самую верхнюю сущность из базы данных. Это означает, что крайние левые столбцы в наборе результатов будут столбцами этой сущности, повторяемыми для каждой записи.

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

Попробуйте отключить отложенную загрузку для текущего запроса, вы можете просто поместить его в блок использования

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