Entity Framework Core 3.0 多对多相同 table

Entity Framework Core 3.0 Many-to-Many for the same table

我正在使用 ef core 3.0 代码优先数据库。我有一个 table、Status,我需要创建一个与其自身的关系以列出可能的 "next status" List<Status> SubsequentStatuses。这当然是系统地控制对象的工作流程。

从表面上看,它会在 table 中创建一个一对多关系和一个新的 StatusId 列;但是,我需要能够将状态设置为 "SubsequentStatus" 到多个状态。

例如,如果有4个状态:

我想要以下

请注意 "Cancelled" 与 "New" 和 "In Work"

相关

这是我目前的 类 和配置:

public class EstimateStatus
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<EstimateStatusRel> SubsequentStatuses { get; set; }
}

public class EstimateStatusRel
{
    public int EstimateStatusId { get; set; }
    public EstimateStatus EstimateStatus { get; set; }

    public int SubsequentStatusId { get; set; }
    public EstimateStatus SubsequentStatus { get; set; }
}

public class SapphireContext : DbContext
{    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<EstimateStatusRel>().HasKey(x => new { x.EstimateStatusId, x.SubsequentStatusId });

        modelBuilder.Entity<StatusRel>()
            .HasOne(pt => pt.Status)
            .WithMany(p => p.SubsequentStatuses)
            .HasForeignKey(pt => pt.StatusId);
    }
}

这造成的问题是,当 Entity Framework 构建迁移时,它会出错关于多个级联删除操作,但是当我将 NoAction 修饰符添加到 modelBuilder fluent API,还是没有清除错误

一对多关系中的自引用,可以试试下面的代码:

public class EstimateStatus
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int? ParentId { get; set; }

    public EstimateStatus ParentStatuses { get; set; }
    public virtual ICollection<EstimateStatus> SubsequentStatuses { get; set; }
}

public class TestDbContext:DbContext
{
    public TestDbContext (DbContextOptions<TestDbContext> options):base(options)
    { }

    public DbSet<EstimateStatus> EstimateStatuse { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<EstimateStatus>()
            .HasMany(e => e.SubsequentStatuses)
            .WithOne(s => s.ParentStatuses)
            .HasForeignKey(e => e.ParentId);
    }
}

最后是因为我没有指定 OnDelete 操作

这是我的最终配置:

    modelBuilder.Entity<EstimateStatusRel>()
                .HasOne(pt => pt.Status)
                .WithMany(p => p.SubsequentStatus)
                .HasForeignKey(pt => pt.EstimateStatusId)
                .OnDelete(DeleteBehavior.NoAction);