带有FK的实体框架核心表,并带有多个父级

问题描述 投票:0回答:1

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

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

例如,如果有四种状态:

  • 在工作中
  • 完成
  • 已取消

我想要以下内容

    • 后续状态
      • 在工作中
      • 已取消
  • 在工作中
    • 后续状态
      • 完成
      • 已取消
  • 完整
  • 已取消

[“已取消”与“新”和“在工作中”有关的通知

这是我目前拥有的类和配置:

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 asp.net-core entity-framework-core ef-code-first
1个回答
0
投票

对于一对多关系中的自参考,您可以尝试以下代码:

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.