我尝试使用ef core 2.1访问该学生最新成绩的GradeInfo属性
我在问题末尾列出了模型
var students = applicationDbContext.Students.Where(s => s.Id ==2)
.Select(student => new {
LatestGrade = student.Grades.OrderBy(g => g.Date).FirstOrDefault(),
Id = student.Id
}).ToList();
此外,我在startup.cs中使用延迟加载代理(来自Microsoft.EntityFrameworkCore.Proxies)
services.AddDbContext<ApplicationDbContext>(options =>
options.UseLazyLoadingProxies()
.UseSqlServer(connectionString));
引发的错误是:
“为警告Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning而生成的错误:尝试对类型为'GradeProxy'的分离实体延迟加载导航属性'Info'。分离实体或以下实体不支持延迟加载加载了'AsNoTracking()'。”
此外,我想说明一下,我尝试按照以下代码中的说明将Inculde添加到用户的dbset中,但是问题没有解决。
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;}
}
答案 0 :(得分:2)
对于此问题,其原因是,如果更改查询以使其不再返回查询开始的实体类型的实例,则将忽略include运算符。您可以参考Ignored includes 。
并且,当前不支持通过Include
查询导航属性,请参考Are .Include/.ThenInclude supposed to work with Select in 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();