渴望在EF Core中一对多地一对一加载

时间:2018-12-13 17:26:01

标签: c# entity-framework asp.net-core entity-framework-core

我有一个数据库架构,如下所示:

ER Model

这是我急切需要为我的数据加载的代码:

var item = db.Course
    .Include(p => p.CourseInstructor)
    .FirstOrDefault(p => p.CourseId == courseId);

if (item == null)
{
    return NotFound();
}

return (from p in item.CourseInstructor
        select p.Instructor).ToList();

我所能获得的只是null导航属性上的p.Instructor

我曾尝试使用ThenInclude,但我不知道如何正确编码。

Wrong trial

如何使用Eager加载技术使此代码按预期工作,以获取完整的Person数据?

1 个答案:

答案 0 :(得分:0)

我终于意识到ThenInclude有两个签名。对于navigationPropertyPath参数,这两个签名是不同的:

  1. Expression<Func<CourseInstructor, Person>>
  2. Expression<Func<ICollection<CourseInstructor>, ICollection<CourseInstructor>>

在Visual Studio 2017中,将仅选择一个签名来提供IntelliSense建议。在我的VS2017中,将选择第二个签名。这样我就看不到第一个签名的任何建议。

以下屏幕截图是我的意图的“正确”签名,但VS2017将不选择此签名。

enter image description here

对于我来说,我需要做的只是输入所需的navigationPropertyPath。在没有IntelliSense帮助的情况下输入正确的属性名称。错误检查将通过,您的项目将能够正确构建!

这是我在下面编写的最终代码:

var item = db.Course
    .Include(p => p.CourseInstructor)
        .ThenInclude(i => i.Instructor)
    .FirstOrDefault(p => p.CourseId == courseId);

if (item == null)
{
    return NotFound();
}

return (from p in item.CourseInstructor
        select p.Instructor).ToList();

它只是按预期工作。


此已知错误已在此处跟踪:Completion missing members of lambda parameter in fault tolerance case · Issue #8237 · dotnet/roslyn