- 实体框架教程
- 实体框架 - 主页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体 F - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架-DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体 F - 代码优先方法
- 实体 F - 模型优先方法
- 实体 F - 数据库优先方法
- 实体框架 - DEV 方法
- 实体F——数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体 F - 存储过程
- 实体 F - 断开连接的实体
- 实体 F - 表值函数
- 实体框架 - 本机 SQL
- 实体框架 - 枚举支持
- 实体F - 异步查询
- 实体框架 - 持久性
- 实体 F - 投影查询
- 实体 F - 命令记录
- 实体F——命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 预加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体 F - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注释
- 实体框架 - 流畅的 API
- 实体框架-种子数据库
- 实体 F - 代码优先迁移
- 实体 F - 多个 DbContext
- 实体 F - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用的资源
- 实体框架 - 讨论
实体框架 - 关系
在关系数据库中,关系是关系数据库表之间通过外键存在的一种情况。外键 (FK) 是一个列或列的组合,用于建立和强制两个表中的数据之间的链接。下图包含三个表。
- 学生
- 课程
- 注册
在上图中,您可以看到表之间的某种关联/关系。表之间的关系分为三种类型,不同表之间的关系取决于相关列的定义方式。
- 一对多关系
- 多对多关系
- 一对一的关系
一对多关系
一对多关系是最常见的关系类型。
在这种类型的关系中,表 A 中的一行可以在表 B 中具有多个匹配行,但表 B 中的一行在表 A 中只能有一个匹配行。
外键在表示关系多端的表中定义。
例如,上图中的Student和Enrollment表是一对多的关系,每个学生可能有多个学号,但每个学号只属于一个学生。
在实体框架中,这些关系也可以用代码创建。以下是与一对多关系关联的学生和注册课程的示例。
public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } } public class Enrollment { public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public Grade? Grade { get; set; } public virtual Course Course { get; set; } public virtual Student Student { get; set; } }
在上面的代码中,您可以看到Student类包含Enrollment的集合,但是Enrollment类只有一个Student对象。
多对多关系
在多对多关系中,表 A 中的一行可以在表 B 中拥有多个匹配行,反之亦然。
您可以通过定义第三个表(称为联结表)来创建此类关系,该表的主键由表 A 和表 B 的外键组成。
例如,“学生”表和“课程”表具有多对多关系,该关系是通过从这些表中的每一个表到“注册”表的一对多关系来定义的。
以下代码包含 Course 类和上面的两个类,即Student和Enrollment。
public class Course { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } }
您可以看到 Course 类和 Student 类都有 Enrollment 对象的集合,这些对象通过连接类 Enrollment 建立多对多关系。
一对一的关系
在一对一关系中,表 A 中的一行在表 B 中只能有一个匹配行,反之亦然。
如果两个相关列都是主键或具有唯一约束,则会创建一对一关系。
在一对一关系中,主键还充当外键,并且两个表都没有单独的外键列。
这种类型的关系并不常见,因为以这种方式相关的大多数信息都在一个表中。您可以使用一对一的关系来 -
- 将一个表分成许多列。
- 出于安全原因隔离表的一部分。
- 存储短暂的数据,只需删除表即可轻松删除。
- 存储仅适用于主表子集的信息。
以下代码是添加另一个类名 StudentProfile,其中包含学生电子邮件 ID 和密码。
public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } public virtual StudentProfile StudentProfile { get; set; } } public class StudentProfile { public StudentProfile() {} public int ID { get; set; } public string Email { get; set; } public string Password { get; set; } public virtual Student Student { get; set; } }
您可以看到 Student 实体类包含 StudentProfile 导航属性,StudentProfile 包含 Student 导航属性。
每个学生只有一个电子邮件和密码来登录大学域。这些信息可以添加到学生表中,但出于安全原因,它被分隔到另一个表中。