Entity Framework Core-使用Fluent API配置多对多关系

通过Fluent API 配置EF Core多对多关系,首先我们需要在两个类中添加集合导航属性,接着使用UsingEntity方法添加关联表

1 例子:Fluent API多对多关系

如下两个实体类 Student & Teacher.

public class Student{    public int Id { get; set; }    public string Name { get; set; }}public class Teacher{    public int Id { get; set; }    public string Name { get; set; }}
在两个类中分别添加一个集合导航属性
public class Student{    public int Id { get; set; }    public string Name { get; set; }    public IList<Teacher> Teacher { get; set; } //collection navigation property}public class Teacher{    public int Id { get; set; }    public string Name { get; set; }    public IList<Student> Student { get; set; } //collection navigation property}
接下来在DbContext的OnModelCreating方法内使用UsingEntity方法来创建实体之间关联,在下面代码中我们给与TeacherStudent作为关联实体
public class SchoolContext : DbContext{    public DbSet<Teacher> Teacher { get; set; }    public DbSet<Student> Student { get; set; }    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)    {    }    protected override void OnModelCreating(ModelBuilder modelBuilder)    {        //Write Fluent API configurations here        modelBuilder.Entity<Teacher>()                    .HasMany(t => t.Student)                    .WithMany(t => t.Teacher)                    .UsingEntity(j => j.ToTable("TeacherStudent"));    }}
当我们执行migrations,EF Core 将会创建一个名字为TeacherStudent的关联表,这张表将包含Teacher和Student的外键,如下图所示:

Entity Framework Core-使用Fluent API配置多对多关系

Student & Teacher 这两个实体是多对多的关系,意味着一个学生有多个老师,同时一个老师又有多个学生

2 EF Core 5.0 以及之前版本

针对EF Core 5.0以及之前的版本,创建多对多关系的过程是不同的,我们首先需要创建一个关联实体,我们将这个关联名称叫做TeacherStudent,你也可以起个别的名字

关联表包含了两个实体的外键,该实体的主键由这两个外键组合而成

public class TeacherStudent{    public Student Student { get; set; }    public Teacher Teacher { get; set; }}

通过下列配置多对多关系

第一步 – 在关联表中添加外键属性

public class TeacherStudent{    public int StudentId { get; set; } //foreign key property    public Student Student { get; set; } //Reference navigation property
    public int TeacherId { get; set; } //foreign key property    public Teacher Teacher { get; set; } //Reference navigation property}

第一步 – 在另外实体中添加集合导航属性

public class Student{    public int Id { get; set; }    public string Name { get; set; }    public IList<TeacherStudent> TeacherStudent { get; set; } //collection navigation property}public class Teacher{    public int Id { get; set; }    public string Name { get; set; }    public IList<TeacherStudent> TeacherStudent { get; set; } //collection navigation property}
第三步 – 在DBContext的OnModelCreating()方法中做配置
modelBuilder.Entity<TeacherStudent>().HasKey(t => new { t.StudentId, t.TeacherId });
第四步– 使用Fluent API创建一对多关系
modelBuilder.Entity<TeacherStudent>()            .HasOne(t => t.Student)            .WithMany(t => t.TeacherStudent)            .HasForeignKey(t => t.StudentId);
modelBuilder.Entity<TeacherStudent>()            .HasOne(t => t.Teacher)            .WithMany(t => t.TeacherStudent)            .HasForeignKey(t => t.TeacherId);

全部代码

public class SchoolContext : DbContext{    public DbSet<Teacher> Teacher { get; set; }    public DbSet<Student> Student { get; set; }    public DbSet<TeacherStudent> TeacherStudent { get; set; }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        if (!optionsBuilder.IsConfigured)        {            optionsBuilder.UseSqlServer(@"Server=vaio;Database=Company;Trusted_Connection=True;");        }    }    protected override void OnModelCreating(ModelBuilder modelBuilder)    {        //Write Fluent API configurations here
        modelBuilder.Entity<TeacherStudent>().HasKey(t => new { t.StudentId, t.TeacherId });
        modelBuilder.Entity<TeacherStudent>()                    .HasOne(t => t.Student)                    .WithMany(t => t.TeacherStudent)                    .HasForeignKey(t => t.StudentId);

        modelBuilder.Entity<TeacherStudent>()                    .HasOne(t => t.Teacher)                    .WithMany(t => t.TeacherStudent)                    .HasForeignKey(t => t.TeacherId);    }}

总结

这节我们主要介绍了在EF Core中使用Fluent API配置多对多关系
源代码地址
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/EntityFrameworkCore/EFCoreFluentAPIManyToMany