首页 > 解决方案 > Entity Framework Core 3.0 同一张表的多对多

问题描述

我正在使用 ef core 3.0 代码优先数据库。我有一个表,Status我需要创建与自身的关系以列出可能的“下一个状态” List<Status> SubsequentStatuses。这当然是为了系统地控制对象的工作流程。

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

例如,如果有 4 个状态:

我想要以下

请注意,“已取消”与“新”和“工作中”相关

这是我此时拥有的类和配置:

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 时,它仍然没有清除错误

标签: entity-frameworkasp.net-coreentity-framework-coreef-code-first

解决方案


它最终是因为我没有指定一个OnDelete动作

这是我的最终配置:

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

推荐阅读