在关系数据库中,关系是通过外键在关系数据库表之间存在的情况.外键(FK)是列或列的组合,用于在两个表中的数据之间建立和实施链接.下图包含三个表格.
学生
课程
注册
在上图中,您可以看到表之间的某种关联/关系.表之间有三种类型的关系,不同表之间的关系取决于相关列的定义方式.
一对一许多关系
多对多关系
一对一关系
一对多关系是最常见的关系类型关系.
在这种类型的关系中,表A中的一行可以在表B中有许多匹配的行,但表B中的一行只能有一行表A中的匹配行.
外键在表中定义,表示关系的多端.
例如,在上图中,学生和入学表具有一对一的关系,每个学生可能有很多注册,但每个注册只属于一个学生.
在实体框架中,这些关系也可以用代码创建.以下是与一对多关系相关联的学生和注册课程的示例.
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 Object.
在多对多关系中,表A中的一行可以在表B中有许多匹配的行,反之亦然.
您可以通过定义第三个表(称为联结表)来创建这样的关系,该表的主键由表A和表B中的外键组成.
例如,Student和Course表具有由多对多关系定义的关系从每个表到注册表的一对多关系.
以下代码包含Course类和上面两个课程,即学生和注册.
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对象的集合,这些对象通过联结类创建了多对多关系注册.
在一对一中 - 一个关系,表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导航属性.
每位学生只有一个电子邮件和密码才能登录大学域名.这些信息可以添加到Student表中,但出于安全原因,它会被分隔到另一个表.