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个状态:
- 新建
- 工作中
- 完成
- 已取消
我想要以下
- 新建
- 后续状态
- 工作中
- 已取消
- 工作中
- 后续状态
- 完成
- 已取消
- 完成
- None
- 已取消
- None
请注意 "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);
我正在使用 ef core 3.0 代码优先数据库。我有一个 table、Status
,我需要创建一个与其自身的关系以列出可能的 "next status" List<Status> SubsequentStatuses
。这当然是系统地控制对象的工作流程。
从表面上看,它会在 table 中创建一个一对多关系和一个新的 StatusId 列;但是,我需要能够将状态设置为 "SubsequentStatus" 到多个状态。
例如,如果有4个状态:
- 新建
- 工作中
- 完成
- 已取消
我想要以下
- 新建
- 后续状态
- 工作中
- 已取消
- 后续状态
- 工作中
- 后续状态
- 完成
- 已取消
- 后续状态
- 完成
- None
- 已取消
- None
请注意 "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);