如何使用EntityFrameworkCore定义同实体的自引用父子层级关系?
错误原因
你当前的Fluent API配置将Category的两个自引用导航属性识别为了两条独立的关系:
- 第一条
HasMany(x => x.Children).WithOne()配置了一条无反向导航的一对多关系,绑定外键ParentCategoryId - 第二条
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
相关产品推荐
相关产品推荐

