0

I have a problem with design DB schema when I try to build schema by db model ef. I need to get a model according to this scheme:

enter image description here

My DbContext:

public class AppContext : DbContext
{
    public AppContext() : base("AppDbContext")
    {
        Database.Delete();
        Database.CreateIfNotExists();
    }

    public DbSet<A1> A1 { get; set; }
    public DbSet<A2> A2 { get; set; }
    public DbSet<A1_A2> A1_A2 { get; set; }
    public DbSet<B> B { get; set; }
    public DbSet<C> C { get; set; }
    public DbSet<D> D { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<A1>()
            .HasMany(a => a.A1_A2)
            .WithRequired(a => a.A1)
            .HasForeignKey(a => a.A1_id)
            .WillCascadeOnDelete(true);
        
        modelBuilder.Entity<A2>()
            .HasMany(a => a.A1_A2)
            .WithRequired(a => a.A2)
            .HasForeignKey(a => a.A2_id)
            .WillCascadeOnDelete(true);
        
        modelBuilder.Entity<A1_A2>()
            .HasMany(a => a.B)
            .WithRequired(a => a.A1A2)
            .HasForeignKey(a => a.A1A2_id)
            .WillCascadeOnDelete(true);
        
        modelBuilder.Entity<B>()
            .HasMany(a => a.C)
            .WithRequired(a => a.B)
            .HasForeignKey(a => a.B_id)
            .WillCascadeOnDelete(true);
        
        modelBuilder.Entity<B>()
            .HasMany(a => a.D)
            .WithRequired(a => a.B)
            .HasForeignKey(a => a.B_id)
            .WillCascadeOnDelete(true);
        
        modelBuilder.Entity<C>()
            .HasMany(a => a.D)
            .WithRequired(a => a.C)
            .HasForeignKey(a => a.C_id)
            .WillCascadeOnDelete(true);
        
        base.OnModelCreating(modelBuilder);
    }
}

Entities:

public class Base
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }
}

public class A1 : Base
{
    public ICollection<A1_A2> A1_A2 { get; set; } = new HashSet<A1_A2>();
}

public class A2 : Base
{
    public ICollection<A1_A2> A1_A2 { get; set; } = new HashSet<A1_A2>();
}

public class A1_A2 : Base
{
    public A1 A1 { get; set; }
    public int A1_id { get; set; }
    public A2 A2 { get; set; }
    public int A2_id { get; set; }
    
    public ICollection<B> B { get; set; } = new HashSet<B>();
}

public class B : Base
{
    public A1_A2 A1A2 { get; set; }
    public int A1A2_id { get; set; }
    
    public ICollection<D> D { get; set; } = new HashSet<D>();
    public ICollection<C> C { get; set; } = new HashSet<C>();
}

public class C : Base
{
    public B B { get; set; }
    public int B_id { get; set; }

    public ICollection<D> D { get; set; } = new HashSet<D>();
}

public class D : Base
{
    public C C { get; set; }
    public int C_id { get; set; }
    public B B { get; set; }
    public int B_id { get; set; }
}

And this is the error I get:

Introducing FOREIGN KEY constraint 'FK_dbo.D_dbo.B_B_id' on table 'D' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

marc_s
  • 675,133
  • 158
  • 1,253
  • 1,388
Vadim
  • 23
  • 3

0 Answers0