首页 > 解决方案 > EF Core 自引用一对多,在删除时设置 null 并在更新时级联可能会导致循环或多个路径

问题描述

所以,我试图创建的是一个关系,其中我有一个实体 ( ProductCategory),它与自身具有一对多的关系。这在我没有操作 OnDelete 和 OnUpdate 时效果很好,但我希望在ParentId删除父级 (SetNull OnDelete) 并在更新时级联时将(外键)设置为空。

不幸的是,当我尝试运行迁移时,我收到以下错误:

在表“ProductCategories”上引入 FOREIGN KEY 约束“FK_ProductCategories_ProductCategories_ParentId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。请参阅以前的错误。

这是我使用的代码:

public class ProductCategory
{
    public Guid Id { get; set; }
    public string Slug { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Product> Products { get; set; }

    public Guid? ParentId { get; set; }
    public virtual ProductCategory Parent { get; set; }
    
    public virtual ICollection<ProductCategory> Children { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{

    // ...

    modelBuilder.Entity<ProductCategory>(entity =>
    {
        entity.HasKey(t => t.Id);
        entity.Property(t => t.Id)
            .HasDefaultValueSql("NEWID()");
        entity.Property(t => t.ParentId)
            .HasDefaultValue(null);
        entity.HasIndex(t => t.Slug)
            .IsUnique();
        entity.HasMany(t => t.Children)
            .WithOne(c => c.Parent)
            .HasForeignKey(c => c.ParentId)
            .OnDelete(DeleteBehavior.SetNull)
            .IsRequired(false);
        entity.HasMany(t => t.Products)
            .WithOne(p => p.Category)
            .HasForeignKey(p => p.CategoryId)
            .OnDelete(DeleteBehavior.SetNull)
            .IsRequired(false);
    });
}

顺便说一句,如果它有任何后果,我正在使用 SQL Server。

标签: c#sql-serverentity-framework-core

解决方案


推荐阅读