Entity Framework 多对多映射
时间:2022-07-24
本文章向大家介绍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);
}
}
从上面的 学生映射类 可以看出,一个学生可以选择多门课程,一个课程可以被多名学生选择。我们为了实现学生和课程多对多的关系,于是定义了关联表,并且设置了这个关联表中两个外键的名称。
注:
- 在设置多对多关系的时候,如果不定义 MapLeftKey 和 MapRightKey EF将默认使用 实体类型_id 。在本例中如果不定义这两个键的名称的话,EF默认使用的名称是 Student_Id 和 Courses_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<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();
}
}
代码运行后,数据库将出现三张表 Students 、 Coureses 和 StudentCourses ,其中 StudentCourses 是 关联表 ,该表中将出现 Students 和 Coureses 之间的关系
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何修改终端中$符号前面的一串名称?
- Alfred 有多强悍,我写了个一键上传图片的 workflow 来告诉你
- Peewee出错:Illegal mix of collations
- 【TOOLS】Linux环境下升级python2.7到python3.6
- 溯源黑帽利用 Web 编辑器漏洞非法植入 SEO 页面事件
- Milvus 查询合并机制
- Django model 层之Models与Mysql数据库小结
- 【010期】JavaSE面试题(十):集合之Map18连环炮!
- 每日打卡 373. 查找和最小的K对数字
- IE11出现"__doPostBack”未定义
- latex()、ploy2sym()、symsum()的妙用
- 性能最佳实践:MongoDB数据建模和内存大小调整
- 节省你生命的一个小技术No.193
- K8S 生态周报| Traefik v2.3.0-rc2 发布
- 如何从 Notion 批量导出 Markdown?