实体框架设计数据库架构

时间:2020-07-21 11:29:25

标签: c# database entity-framework database-design database-schema

当我尝试通过数据库模型ef构建架构时,我对设计数据库架构存在问题。 我需要根据这种方案获得模型:

enter image description here

我的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);
    }
}

实体:

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; }
}

这是我得到的错误:

在表'D'上引入FOREIGN KEY约束'FK_dbo.D_dbo.B_B_id'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
无法创建约束或索引。查看先前的错误。

0 个答案:

没有答案