实体框架 – 关系

实体框架 – 关系


在关系数据库中,关系是关系数据库表之间通过外键存在的一种情况。外键 (FK) 是一列或列组合,用于在两个表中的数据之间建立和强制建立链接。下图包含三个表。

  • 学生
  • 课程
  • 注册

关系型数据库

在上图中,您可以看到表之间的某种关联/关系。表之间存在三种关系,不同表之间的关系取决于相关列的定义方式。

  • 一对多关系
  • 多对多关系
  • 一对一关系

一对多关系

  • 一对多关系是最常见的关系类型。

  • 在这种关系中,A表中的一行可以在B表中有很多匹配的行,而B表中的一行在A表中只能有一个匹配行。

  • 外键在表示关系多端的表中定义。

  • 比如上图中的Student表和Enrollment表是一对多的关系,每个学生可能有多个注册,但每个注册只属于一个学生。

在实体框架中,这些关系也可以用代码创建。以下是与一对多关系相关联的 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 的外键组成。

  • 例如,Student 和 Course 表具有多对多关系,该关系由这些表中的每一个表到 Enrollment 表的一对多关系定义。

以下代码包含 Course 类和上述两个类,即StudentEnrollment

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 导航属性。

每个学生只有一个电子邮件和密码来登录大学域。这些信息可以添加到 Student 表,但出于安全原因,它被分隔到另一个表。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁