Entity Framework 多对多映射

简介: Entity Framework 多对多映射

上一篇文章我们讲解了EF中的一对对多的关系映射,这篇文章我们讲解EF中的多对多(Many-to-Many Relationship)关系映射。这篇文章我们同样通过一个简单的例子来讲解多对多的关系映射。


零、自动生成关系表

故事:在一个学生选课系统中,存在学生和课程两个实体,他们之间的关系是:一个学生可以选择多门课程,一门课程也可以被多个学生选择。


通过上面简单的描述,我们可以分析出学生和课程是多对多的关系。这种关系应设在数据库中就需要第三张表来辅助维持。这个第三张表被称为关联表或链接表,这张表中存存储了学生和课程的主键(或被能够区分唯一性的字段)。现在我们看一下,通过代码怎么来表示多对多关系:

//学生类
public class Student:BaseEntity
{
    public string Name { get; set; }
    public int Age { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}
//课程类
public class Course : BaseEntity
{
    public string Name { get; set; }
    public string TeacherName { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}
//基础类
public class BaseEntity
{
    public int Id { get; set; }
    public DateTime CreateDateTime { get; set; }
}

同上一篇文章一样,我们创建 Student Course 的映射类

//学生映射类
public class StudentsMap : EntityTypeConfiguration<Student>
{
    public StudentsMap()
    {
        //表名称
        ToTable("Students");
        //主键
        HasKey(p => p.Id);
        //设置主键自增长
        Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        //设置要映射的数据
        Property(p => p.Name).HasColumnType("VARCHAR").HasMaxLength(50);
        Property(p => p.Age);
        Property(p => p.CreateDateTime);
        //设置关系
        HasMany(p => p.Courses)
            .WithMany(p => p.Students)
            .Map(p => p.ToTable("StudentCourses")
                .MapLeftKey("StudentId")
                .MapRightKey("CourseId"));
    }
}
//课程映射类
public class CourseMap : EntityTypeConfiguration<Course>
{
    public CourseMap()
    {
        ToTable("Coureses");
        HasKey(p => p.Id);
        Property(p => p.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(p => p.Name).HasColumnType("VARCHAR").HasMaxLength(50);
        Property(p => p.TeacherName);
        Property(p => p.CreateDateTime);
    }
}

从上面的 学生映射类 可以看出,一个学生可以选择多门课程,一个课程可以被多名学生选择。我们为了实现学生和课程多对多的关系,于是定义了关联表,并且设置了这个关联表中两个外键的名称。


注:

  1. 在设置多对多关系的时候,如果不定义 MapLeftKey MapRightKey EF将默认使用 实体类型_id 。在本例中如果不定义这两个键的名称的话,EF默认使用的名称是 Student_IdCourses_Id;
  2. MapLeftKey 是关系键


下面我们编写一段代码来测试一下数据库生成的是否是多对多的关系:

static void Main(string[] args)
{
    using (var efContext = new EFContext())
    {
        Student student = new Student
        {
            Name = "张三",
            Age = 26,
            CreateDateTime = DateTime.Now,
            Courses = new List<Course>
            {
                new Course
                {
                    Name="语文",
                    TeacherName="王老师",
                    CreateDateTime=DateTime.Now
                },
                new Course
                {
                    Name="数学",
                    TeacherName="孙老师",
                    CreateDateTime=DateTime.Now
                }
            }
        };
        Course course = new Course
        {
            Name = "英语",
            TeacherName = "Jack",
            CreateDateTime = DateTime.Now,
            Students = new List<Student>
            {
                new Student
                {
                    Name="王五",
                    Age=27,
                    CreateDateTime=DateTime.Now
                },
                new Student
                {
                    Name="孙琦",
                    Age=27,
                    CreateDateTime=DateTime.Now
                }
            }
        };
        efContext.Students.Add(student);
        efContext.Courses.Add(course);
        efContext.SaveChanges();
    }
}

代码运行后,数据库将出现三张表 StudentsCouresesStudentCourses ,其中 StudentCourses 关联表 ,该表中将出现 Students Coureses 之间的关系

image.png

目录
相关文章
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1276 5
|
2天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1296 87
|
12天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1831 13