在一个上下文调用中加载多个导航属性

时间:2018-09-21 19:31:48

标签: c# entity-framework-core

我正在编写一个利用EF Core生成与数据库的所有关系的C#应用​​程序。我目前仅在需要时才尝试加载某些关系(在这种情况下是在尝试删除记录时)。

我试图使用Context.Entry以便仅在需要它们时才加载所需的关系,请参见下文:

await Context.Entry(entity).Collection(e => e.DBTable1).LoadAsync();
await Context.Entry(entity).Collection(e => e.DBTable2).LoadAsync();

我很好奇的是,是否可以将多个关系合并到单个load语句中,如下所示:

await Context.Entry(entity).Collection(e => e.DBTable1 && e => e.DBTable2).LoadAsync();

我知道我可以在执行EF查询之前使用.include / .thenInclude建立关系,但是,我的工作流程要求在执行查询后加载关系。

1 个答案:

答案 0 :(得分:1)

在加载必需的数据时,EF中的跟踪实体应具有其导航属性/集合。尝试将所需的属性/集合投影为匿名类型,并验证所需的属性是否已填充在原始实体对象中:

await dbContext.Set<TEntity>()
    .Where( e => e.Id == entity.Id )
    .Select( e => new
    {
        DoesntMatter01 = e.DBTable1,
        DoesntMatter02 = e.DBTable2,
    } )
    .SingleOrDefaultAsync();

请注意,只要枚举查询,您实际上并不关心结果。在这种情况下,我们使用SingleOrDefault,但是如果我们选择实体集合的ID,然后在ids.Contains( e.Id )中使用where,则可以相同的方式为给定类型的所有跟踪实体加载这些属性。 ToArray谓词,然后通过调用public Task LoadEntityCollections( DbContext dbContext, IEnumerable<EntityType> entities ) { dbContext.Set<EntityType>() .Where( e => entities.Select( ei => ei.Id ).Contains( e.Id ) ) .Select( e => new { // assign from properties you want loaded } ) .ToArrayAsync(); } 或类似方法进行枚举,该方法将返回所有结果。

运行该命令,并验证是否已按预期填充集合属性。

编辑:因为我感到很积极:

['ref']