Entity Framework Eager Loading仅填充最后一条记录Status属性问题
问题原因
核心原因是实体关系配置错误:你将SearchFilterData与FilterStatus的关联配置为了一对一关系,但实际业务逻辑中二者是标准的一对多关系——多条SearchFilterData记录完全可以关联同一个FilterStatus(你的示例数据里3条记录的StatusId均为1,对应同一个ACTIVE状态)。
EF Core在处理一对一关系时,会约定被引用的从属实体只能绑定到一个主实体上。当查询结果中出现多条SearchFilterData指向同一个FilterStatus记录时,EF Core会把前面已经完成绑定的导航属性重置为null,仅保留最后一次绑定的关联关系,最终就出现了只有最后一条记录的Status属性有值、其余均为null的现象。
另外你的代码里还有一处配置隐患:SearchFilterData实体的CreatedAt属性被标记了[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性,该特性是用于标记自增整数主键的,不适合时间字段,和你在FluentAPI中配置的CURRENT_TIMESTAMP()默认值逻辑冲突,可能导致时间字段取值异常。
修复步骤
- 修正
FilterStatus实体的导航属性,将原单个实体引用改为集合引用,匹配一对多关系:[Table("search_filter_status")] public class FilterStatus { [Key] [Column("id")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Column("name")] public string Name { get; set; } [JsonIgnore] // 替换原单个导航属性为集合 public virtual List<SearchFilterData> SearchFiltersData { get; set; } = new(); } - 修改
DbContext中OnModelCreating方法的关系配置,将原一对一关联改为一对多关联:// 替换原一对一配置段 modelBuilder.Entity<SearchFilterData>() .HasOne<FilterStatus>(x => x.Status) .WithMany(x => x.SearchFiltersData) // 对应FilterStatus中的集合导航属性 .HasForeignKey(x => x.StatusId); - 修正
CreatedAt字段的错误配置,删除SearchFilterData实体中CreatedAt属性上的[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性,如果需要标记字段由数据库生成值,可以替换为[DatabaseGenerated(DatabaseGeneratedOption.Computed)],直接保留FluentAPI中的默认值配置即可正常生效。 - (可选优化)你当前的查询逻辑通过
SearchFilter导航属性做过滤,但没有显式Include该属性,建议在查询中追加.Include(x => x.SearchFilter),避免EF Core生成额外的冗余查询,或者直接从SearchFilter的DbSet出发做关联查询更符合EF Core的最佳实践。
修复后重新执行查询,所有记录的Status导航属性就会被正常填充。
内容的提问来源于stack exchange,提问作者Svetoslav Nedelchev
相关产品推荐
相关产品推荐

