Entity Framework - Relations

Dans les bases de données relationnelles, la relation est une situation qui existe entre des tables de base de données relationnelles via des clés étrangères. Une clé étrangère (FK) est une colonne ou une combinaison de colonnes utilisée pour établir et appliquer un lien entre les données de deux tables. Le diagramme suivant contient trois tableaux.

  • Student
  • Course
  • Enrollment

Dans le diagramme ci-dessus, vous pouvez voir une sorte d'association / relation entre les tables. Il existe trois types de relations entre les tables et la relation entre les différentes tables dépend de la manière dont les colonnes associées sont définies.

  • Relation un-à-plusieurs
  • Relation plusieurs à plusieurs
  • Relation individuelle

Relation un-à-plusieurs

  • Une relation un-à-plusieurs est le type de relation le plus courant.

  • Dans ce type de relation, une ligne de la table A peut avoir plusieurs lignes correspondantes dans la table B, mais une ligne de la table B ne peut avoir qu'une seule ligne correspondante dans la table A.

  • La clé étrangère est définie dans la table qui représente l'extrémité plusieurs de la relation.

  • Par exemple, dans le diagramme ci-dessus, les tables Élève et Inscription ont une relation un-à-plusieurs, chaque étudiant peut avoir plusieurs inscriptions, mais chaque inscription appartient à un seul étudiant.

Dans le cadre d'entité, ces relations peuvent également être créées avec du code. Voici un exemple de classes d'étudiants et d'inscription qui sont associées à une relation un à plusieurs.

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; }
}

Dans le code ci-dessus, vous pouvez voir que la classe Student contient la collection d'Enrollment, mais que la classe Enrollment a un seul objet Student.

Relation plusieurs à plusieurs

Dans une relation plusieurs-à-plusieurs, une ligne de la table A peut avoir plusieurs lignes correspondantes dans la table B, et vice versa.

  • Vous pouvez créer une telle relation en définissant une troisième table, appelée table de jonction, dont la clé primaire est constituée des clés étrangères de la table A et de la table B.

  • Par exemple, les tables Student et Course ont une relation plusieurs-à-plusieurs qui est définie par une relation un-à-plusieurs entre chacune de ces tables et la table d'inscription.

Le code suivant contient la classe Course et les deux classes ci-dessus, c'est-à-dire Student et 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; }
}

Vous pouvez voir que la classe de cours et la classe Student ont des collections d'objets d'inscription qui établissent une relation plusieurs-à-plusieurs via l'inscription de classe de jonction.

Relation individuelle

  • Dans une relation un à un, une ligne de la table A ne peut avoir plus d'une ligne correspondante dans la table B, et vice versa.

  • Une relation un-à-un est créée si les deux colonnes associées sont des clés primaires ou ont des contraintes uniques.

  • Dans une relation un-à-un, la clé primaire agit en outre comme une clé étrangère et il n'y a pas de colonne de clé étrangère distincte pour l'une ou l'autre table.

Ce type de relation n'est pas courant car la plupart des informations ainsi liées se trouveraient toutes dans une seule table. Vous pouvez utiliser une relation un-à-un pour -

  • Divisez une table avec plusieurs colonnes.
  • Isolez une partie d'une table pour des raisons de sécurité.
  • Stockez des données de courte durée pouvant être facilement supprimées en supprimant simplement la table.
  • Stockez les informations qui s'appliquent uniquement à un sous-ensemble de la table principale.

Le code suivant consiste à ajouter un autre nom de classe StudentProfile qui contient l'ID et le mot de passe de messagerie de l'étudiant.

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; }
}

Vous pouvez voir que la classe d'entité Student contient la propriété de navigation StudentProfile et StudentProfile contient la propriété de navigation Student.

Chaque étudiant n'a qu'un seul e-mail et un seul mot de passe pour se connecter au domaine universitaire. Ces informations peuvent être ajoutées à la table Student, mais pour des raisons de sécurité, elles sont séparées dans une autre table.