首页 > 解决方案 > EntityFrameworkCore模型之间的关系和级联删除

问题描述

我有这些课程:

public class A
{
    public A()
    {
        nameA = string.Empty;

        ListB = new List<B>();
    }

    public string nameA { get; set; }

    public List<B> ListB { get; set; }
}


public class B
{
    public C cObject { get; set; }

    public string nameB { get; set; }

}

public class C
{
    public string nameC { get; set; }

}

我正在使用Microsoft.EntityFrameworkCore这些模型的数据库,我能够生成数据库和正确的表,但我缺少两件事:

  1. (A 和 B) 和 (B 和 C) 之间的关系。
  2. 以及级联添加和删除对象的能力(例如,在我的情况下,当删除对象 A 时,删除相应的 B 对象列表)。

这是我的上下文文件中的代码:

public class Context : DbContext
{

    #region Tables

    public DbSet<A> As{ get; set; }
    public DbSet<B> Bs { get; set; }
    public DbSet<C> Cs { get; set; }

    #endregion

    public Context(DbContextOptions options)
        : base(options)
    {

    }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        //primary key's
        modelBuilder.Entity<A>().HasKey(x => x.nameA);
        modelBuilder.Entity<B>().HasKey(x => x.nameB);
        modelBuilder.Entity<C>().HasKey(x => x.nameC);


        //foreign key's 
        modelBuilder.Entity<A>().HasMany<B>(app => app.ListB);
        modelBuilder.Entity<B>().HasOne<C>(app => app.cObject);

        base.OnModelCreating(modelBuilder);
    }

}

标签: c#entity-framework-core

解决方案


您可以根据您的要求使用以下代码。您必须使用A表的 PK 作为外键 inBC表 PK 作为外键 on B。如果你想要,DeleteBehavior.Cascade那么你必须使用Required. 或者你可以使用Fluent API来做到这一点。

public class A
{
    public A()
    {
        nameA = string.Empty;
        ListB = new List<B>();
    }

    public string nameA { get; set; }
    public List<B> B{ get; set; }
}

public class B
{

    public int CForeignKey { get; set; }

    [ForeignKey("CForeignKey")]
    public C C { get; set; }

    public string nameB { get; set; }

    [Required]
    public int AForeignKey { get; set; }

    [ForeignKey("AForeignKey")]
    public A A {get; set;}

}

public class C
{
    public string nameC { get; set; }
}

流畅的 API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<B>()
            .HasOne(p => p.A)
            .WithMany(b => b.B)
            .OnDelete(DeleteBehavior.Cascade);
    }

推荐阅读