查询中的EF Core 2.0代码优先错误(DetachedLazyLoadingWarning)

时间:2018-11-29 13:16:26

标签: c# code-first ef-core-2.0

我的应用程序中有以下查询:

var Company = Db.Company.SingleOrDefault(si => si.Guid == companyId);
var items = Db.Programs.Where(w => w.SubCompanyId == Company.CompanyId)
    .GroupBy(g => g.Projects).Include(i => i.Key.ProjectLeader);
if (skip.HasValue && take.HasValue)
{
    items = items.OrderByDescending(o => o.Key.DatumAanmaak).Skip(skip.Value).Take(take.Value);
}

var materialized = items.ToList();
return materialized.Select(s => new Models.Project()
{
    Guid = s.Key.Guid,
    ProjectId = s.Key.Id,
    Title = s.Key.Titel,
    CompanyId= s.Key.CompanyId,
    ProjectLeaderFk = s.Key.ProjectLeaderId,
    ProjectLeaderName = s.Key.ProjectLeader.FullName,
    IsIncoming = s.Key.IsIncoming ?? true,
    ProgramCount = s.Count(w => w.TargetCompanyId == Company.CompanyId),
    ApplicationAmount = s.Where(w => w.TargetCompanyId == Company.CompanyId).Sum(su => su.ApplicationAmount ),
    AvailableAmount = s.Where(w => w.TargetCompanyId == Company.CompanyId).Sum(su => su.AvailableAmount)
}).ToList();

由于我的项目首先是代码,因此会出现以下错误:

  

System.InvalidOperationException:'为警告'Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning生成的错误:尝试对类型为'ProjectProxy'的分离实体延迟加载导航属性'ProjectLeider'。分离的实体或使用'AsNoTracking()'加载的实体不支持延迟加载。通过将事件ID'CoreEventId.DetachedLazyLoadingWarning'传递到'DbContext.OnConfiguring'或'AddDbContext'中的'ConfigureWarnings'方法,可以抑制或记录该异常。

究竟是什么导致此错误?我没有使用AsNoTracking,而是在查询中包含了导致错误的表格。解决此问题的最简单方法是什么?

2 个答案:

答案 0 :(得分:2)

  

究竟是什么导致此错误?我没有使用AsNoTracking,而是在查询中包含了导致错误的表格。

您的查询属于Ignored Includes类别:

  

如果更改查询以使其不再返回查询开始的实体类型的实例,则将忽略include运算符。

getDatafunction <- function(){ datapath = "D:\\example" files <- dir(datapath) for (i in 1:length(files)) { assign(paste("data",i, sep="_"), read.csv(paste(datapath,files[i], sep="\\"), header=FALSE)) } return(data) } 运算符正在将查询开头的实体类型(GroupBy)更改为其他类型,因此Program无效(被忽略)。

解决该问题的最简单方法可能是直接从可查询源(.Include(i => i.Key.ProjectLeader))中删除实现和项目(Select),例如

items

答案 1 :(得分:1)

以下内容为我解决了此问题:(使用ThenInclude代替Include)

var items = Dbc.SubSubsidieProgrammas.Include(i => i.Project).ThenInclude(i => i.ProjectLeider).Where(w => w.TargetCompanyId == bedrijf.BedrijfPk).GroupBy(g => g.Project);