Entity Framework Core关联查询无结果,请求排查问题
EF Core关联查询无结果问题排查
我执行以下SQL查询可正常获取结果:
SELECT dbo.Show.ShowId, dbo.Show.Name, dbo.Cast.CastId, dbo.Cast.Name, dbo.Cast.Birthday FROM dbo.Show INNER JOIN dbo.Cast ON dbo.Cast.ShowId = dbo.Show.ShowId WHERE dbo.Cast.ShowId=1;
但用Entity Framework Core编写的关联查询无法得到预期结果,初始代码如下:
[HttpGet("{id}")] public async Task<IActionResult> GetShowCast(long? showId) { var query = from s in db.Set<Show>() join c in db.Set<Cast>() on s.ShowId equals c.ShowId where c.CastId == showId select new { c.Birthday, s.Name}; return Json(query); }
数据库连接正常,因为以下接口可正常返回数据:
[HttpGet] public async Task<IActionResult> Index() { return Json(await db.shows.ToListAsync()); }
修改查询条件后仍无结果,调试时结果集Count=0:
[HttpGet("{id}")] public async Task<IActionResult> GetShowCast(long? showId) { var query = from s in db.Set<Show>() join c in db.Set<Cast>() on s.ShowId equals c.ShowId where s.ShowId == showId select new { c.Birthday, s.Name }; return Json(query.ToList()); }
我的实体模型如下:
Cast模型:
[JsonProperty("id")] [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public long CastId { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("birthday")] public string? Birthday { get; set; } public long ShowId { get; set; } public ICollection<Show> Show { get; set; }
Show模型:
[JsonProperty("id")] [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public long ShowId { get; set; } [JsonProperty("name")] public string Name { get; set; } public ICollection<Cast> Casts { get; set; }
问题根源及解决方案
核心问题出在实体模型的导航属性配置错误:
Cast模型的导航属性错误:
从数据库关系来看,一个Cast属于单个Show(通过ShowId外键关联),但你在Cast模型中定义的是public ICollection<Show> Show { get; set; },这会让EF Core误认为Cast和Show是多对多关系,而非一对多关系,导致关联映射逻辑错误,无法正确匹配数据。
正确的配置应该是:public Show Show { get; set; }建议优化查询方式:
EF Core中利用导航属性可以避免手动编写join,代码更简洁且不易出错,修改后的查询代码示例:[HttpGet("{id}")] public async Task<IActionResult> GetShowCast(long? showId) { if (!showId.HasValue) { return BadRequest("无效的ShowId"); } var result = await db.Set<Show>() .Where(s => s.ShowId == showId.Value) .Include(s => s.Casts) // 关联加载关联的Casts数据 .SelectMany(s => s.Casts, (show, cast) => new { cast.Birthday, ShowName = show.Name, CastName = cast.Name // 按需添加字段 }) .ToListAsync(); return Json(result); }显式配置实体关系(可选但推荐):
若DbContext未自动识别关系,建议在OnModelCreating中显式配置一对多关系:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Show>() .HasMany(s => s.Casts) .WithOne(c => c.Show) .HasForeignKey(c => c.ShowId); }
完成以上修改后,EF Core就能正确映射数据库关系,查询也会返回预期结果。
内容的提问来源于stack exchange,提问作者ozkan reyes
相关产品推荐
相关产品推荐

