资讯专栏INFORMATION COLUMN

Entity Framework 多对多映射

TANKING / 2229人阅读

摘要:这个第三张表被称为关联表或链接表,这张表中存存储了学生和课程的主键或被能够区分唯一性的字段。注在设置多对多关系的时候,如果不定义和将默认使用实体类型。

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

零、自动生成关系表

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

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

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

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

//学生映射类
public class StudentsMap : EntityTypeConfiguration
{
    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
{
    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);
    }
}

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

注:

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

MapLeftKey 是关系键

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

static void Main(string[] args)
{
    using (var efContext = new EFContext())
    {
        Student student = new Student
        {
            Name = "张三",
            Age = 26,
            CreateDateTime = DateTime.Now,
            Courses = new List
            {
                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
            {
                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关联表 ,该表中将出现 StudentsCoureses 之间的关系

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61668.html

相关文章

  • Entity Framework 对多映射

    摘要:这个第三张表被称为关联表或链接表,这张表中存存储了学生和课程的主键或被能够区分唯一性的字段。注在设置多对多关系的时候,如果不定义和将默认使用实体类型。 上一篇文章我们讲解了EF中的一对对多的关系映射,这篇文章我们讲解EF中的多对多(Many-to-Many Relationship)关系映射。这篇文章我们同样通过一个简单的例子来讲解多对多的关系映射。 零、自动生成关系表 故事:在一个学...

    shiguibiao 评论0 收藏0
  • [C#/.NET]Entity Framework(EF) Code First 对多关系的实体增

    摘要:本文我们来学习一下在中使用删除多对多关系的实体是如何来实现的。我们将以一个具体的控制台小实例来了解和学习整个实现多对多关系的实体删除的操作过程。执行以上命令,我们这时再打开数据库管理工具。 本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的。我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多...

    baishancloud 评论0 收藏0
  • Entity Framework 小知识(五)

    摘要:在多对多关系映射中关联表是自动生成的。但有时候我们需要显示定义关联表。 在 多对多关系映射 中关联表是EF自动生成的。但有时候我们需要显示定义关联表。我们可以按照如下步骤定义(继续使用多对多关系映射这篇文章饿代码): 定义关联表类: public class StudentCourses : BaseEntity { public int StudentId { get; se...

    aboutU 评论0 收藏0
  • Entity Framework 小知识(五)

    摘要:在多对多关系映射中关联表是自动生成的。但有时候我们需要显示定义关联表。 在 多对多关系映射 中关联表是EF自动生成的。但有时候我们需要显示定义关联表。我们可以按照如下步骤定义(继续使用多对多关系映射这篇文章饿代码): 定义关联表类: public class StudentCourses : BaseEntity { public int StudentId { get; se...

    cod7ce 评论0 收藏0
  • Entity Framework对多关系映射

    摘要:中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在中配置映射。一个客户可以有多个订单,但一个订单只能属于一个客户,所以我们用到了中的,一个客户又存在多个订单,因此也使用到了同时表中有作为外键,因此我们用到了。 EF中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在 OnModelCreating 中配置映射。EF中的关系映射有如下三种: One-to-Many...

    Anshiii 评论0 收藏0

发表评论

0条评论

TANKING

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<