📅  最后修改于: 2020-11-21 07:15:55             🧑  作者: Mango
在关系数据库中,关系是通过外键在关系数据库表之间存在的情况。外键(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 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的外键组成。
例如,Student和Course表具有多对多关系,该关系由这些表中的每一个到Enrollment表之间的一对多关系定义。
以下代码包含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 Enrollments { get; set; }
}
您可以看到课程类和学生类都具有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 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表中,但是出于安全原因,将其分离到另一个表中。