如何使用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
相关产品推荐
相关产品推荐

