You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用EntityFrameworkCore定义同实体的自引用父子层级关系?

错误原因

你当前的Fluent API配置将Category的两个自引用导航属性识别为了两条独立的关系:

  1. 第一条HasMany(x => x.Children).WithOne()配置了一条无反向导航的一对多关系,绑定外键ParentCategoryId
  2. 第二条HasOne(x => x.ParentCategory).WithOne()又额外配置了一条一对一自引用关系,EF Core找不到你手动指定的外键,就自动生成了ParentCategoryId1字段作为这条关系的外键,运行时查询这个不存在的字段就触发了报错。

正确关系配置

只需要保留一条配置,把两个导航属性绑定到同一条一对多自引用关系上即可,不需要分开定义:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Category>(cat =>
    {
        // 一对多自引用:一个父分类对应多个子分类,子分类的反向导航是ParentCategory
        cat.HasMany(x => x.Children)
           .WithOne(x => x.ParentCategory)
           .HasForeignKey(x => x.ParentCategoryId)
           // 可选配置:删除父分类时把所有子分类的ParentCategoryId设为null,避免级联删除报错
           .OnDelete(DeleteBehavior.Restrict);
    });
}

验证

配置完成后你原来的查询代码可以直接运行,能正常获取到ID为10的分类的父分类、以及直接下属的一级子分类。
如果你需要加载多级递归的子分类(比如子分类的子分类),可以额外使用递归CTE查询实现。

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:08