Ef core LazyLoading - доступ к вложенным навигационным свойствам коллекции типов threw DetachedLazyLoadingWarning error - PullRequest
0 голосов
/ 26 февраля 2019

Я пытался получить доступ к свойству GradeInfo последней оценки учащегося, используя ef core 2.1

Я перечислил модели в конце вопроса

var students = applicationDbContext.Students.Where(s => s.Id ==2)
    .Select(student => new { 
        LatestGrade = student.Grades.OrderBy(g => g.Date).FirstOrDefault(),
        Id = student.Id
        }).ToList();

Кроме того, я использую ленивые загрузочные прокси (из Microsoft.EntityFrameworkCore.Proxies) в startup.cs

services.AddDbContext<ApplicationDbContext>(options => 
    options.UseLazyLoadingProxies()
           .UseSqlServer(connectionString));

Выдается ошибка:

"Сгенерирована ошибка для предупреждения Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning: Была предпринята попытка отложенной загрузки свойства навигации «Информация» для отдельного объекта типа «GradeProxy». Ленивая загрузка не поддерживается для отдельных объектов или объектов, которые загружаются с помощью «AsNoTracking ()»."

Кроме того, я хочу заявить, что я пытался добавить Inculde к базе данных sudents, как описано в следующем коде, но проблема не решена.

var student = applicationDbContext.Students.Include( s => s.Grades )
                .ThenInclude( grade => grade.Info).Where(...).Select(...)

модели

class Student{
   public int Id { get; set;}
   public virtual ICollection<Grade> Grades { get; set;}

   ...
}

class Grade {
   public virtual GrandeInfo Info { get; set;}
   public DateTime Date { get; set;}
}

class GrandeInfo {
  public int Id { get; set;}
  public int Score { get; set;}
}

1 Ответ

0 голосов
/ 27 февраля 2019

Для этой проблемы это вызвано тем, что если вы измените запрос так, чтобы он больше не возвращал экземпляры типа сущности, с которого начался запрос, то операторы включения игнорируются.Вы могли бы сослаться Игнорируется включает .

И, в настоящее время, не поддерживается запрос свойства навигации по Include, см. Должны ли .Include / .ThenInclude работать с Select в RC1-final?# 4641 .

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

var students = _context.Students
                    .Where(s => s.Id == 2)
                    .ToList()
                    .Select(student => new
                    {
                        LatestGrade = student.Grades.OrderBy(g => g.Date).FirstOrDefault(),
                        Id = student.Id
                    })
                    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...