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

如何使用EF Core Code-First创建支持子分类的分类表并配置关联关系

EF Core Code-First 实现Category自关联层级结构的方法

第一步:完善Category实体类

在原有字段基础上补充上下级导航属性:

public class Category
{
    public int Id { get; set; }
    public string Title { get; set; }
    // 首字母大写对齐EF命名规范,也可保持原小写通过额外配置映射
    public int? ParentId { get; set; }

    // 导航属性:当前分类的上级分类
    public virtual Category Parent { get; set; }
    // 导航属性:当前分类的所有子分类
    public virtual ICollection<Category> Children { get; set; } = new List<Category>();
}

第二步:配置关联关系

推荐使用Fluent API配置,逻辑更清晰不易出错,在DbContext的OnModelCreating方法中添加如下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Category>()
        .HasOne<Category>(c => c.Parent)
        .WithMany(c => c.Children)
        .HasForeignKey(c => c.ParentId)
        // 级联删除规则可根据业务需求调整
        .OnDelete(DeleteBehavior.Restrict);
}

如果不想修改DbContext,也可以直接通过数据注解完成配置:

public class Category
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int? ParentId { get; set; }

    [ForeignKey(nameof(ParentId))]
    [InverseProperty(nameof(Children))]
    public virtual Category Parent { get; set; }

    [InverseProperty(nameof(Parent))]
    public virtual ICollection<Category> Children { get; set; } = new List<Category>();
}

级联删除规则说明

可根据业务需求调整删除上级分类时的联动逻辑:

  • DeleteBehavior.Restrict:删除上级分类时抛出异常,需提前手动处理所有子分类
  • DeleteBehavior.Cascade:删除上级分类时自动删除所有下属子分类
  • DeleteBehavior.SetNull:删除上级分类时将所有子分类的ParentId设为null,子分类升级为顶级分类

配置完成后执行EF迁移命令即可生成符合要求的表结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:21:03