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的外键,如下图所示:

a986d72ebc3a7ce0c9f68fca18dd6c3b.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值