EF Core使用Include加载关联数据仅最后一条生效其余字段随机为null
问题根因
你的一对多关联关系配置错误,导致EF Core在批量加载数据时导航属性被覆盖。CONF_Contract_Status(以及其他同类型的配置表)中的导航属性当前定义为单个Contract实体,会被EF Core识别为一对一关系,EF Core批量加载多条Contract数据时,同一个状态只会给最后一个匹配的Contract实体填充关联属性,之前的都会被置为null,这就是只有表格最后一行关联数据正常、单条查询的Detail页始终正常的原因。
解决方案
1. 修正配置表的导航属性
把所有配置表中单个Contract导航属性修改为集合类型,标识一对多关系中「一」的一方可以对应多个Contract:
public class CONF_Contract_Status { [Key] public int CS_ID { get; set; } [Required] [Display(Name = "Status")] public string Contract_Status { get; set; } [Required] public bool Enabled { get; set; } // 修正为集合导航属性 public ICollection<Contract> Contracts { get; set; } }
CONF_Business_Unit、CONF_Brand、CONF_Statutory_Unit、CONF_Management_Market都需要做相同修改。
2. (可选)显式配置外键关联
因为你的配置表主键没有遵循EF Core默认命名约定(没有使用ID/Contract_StatusID这类命名),建议在DbContext的OnModelCreating方法中显式配置关联,避免约定匹配出错:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Contract>() .HasOne(c => c.Contract_Status) .WithMany(s => s.Contracts) .HasForeignKey(c => c.Contract_StatusID) .HasPrincipalKey(s => s.CS_ID); // 其他关联表也按照相同规则配置即可 }
修改完成后重新运行项目即可正常加载Index页所有行的关联数据。
内容的提问来源于stack exchange,提问作者scetu
相关产品推荐
相关产品推荐

