Entity Framework - 关系

在关系数据库中,关系是通过外键在关系数据库表之间存在的情况.外键(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表中,但出于安全原因,它会被分隔到另一个表.