Entity Framework - Relazioni

Nei database relazionali, la relazione è una situazione che esiste tra le tabelle del database relazionale tramite chiavi esterne. Una chiave esterna (FK) è una colonna o una combinazione di colonne utilizzata per stabilire e applicare un collegamento tra i dati in due tabelle. Il diagramma seguente contiene tre tabelle.

  • Student
  • Course
  • Enrollment

Nel diagramma sopra, puoi vedere una sorta di associazione / relazione tra le tabelle. Esistono tre tipi di relazioni tra tabelle e la relazione tra tabelle diverse dipende da come sono definite le colonne correlate.

  • Rapporto uno-a-molti
  • Relazione molti-a-molti
  • Rapporto uno a uno

Rapporto uno-a-molti

  • Una relazione uno-a-molti è il tipo di relazione più comune.

  • In questo tipo di relazione, una riga nella tabella A può avere molte righe corrispondenti nella tabella B, ma una riga nella tabella B può avere solo una riga corrispondente nella tabella A.

  • La chiave esterna è definita nella tabella che rappresenta le molte estremità della relazione.

  • Ad esempio, nel diagramma precedente le tabelle Studente e Iscrizione hanno una relazione da uno a più, ogni studente può avere molte iscrizioni, ma ciascuna iscrizione appartiene a un solo studente.

In entity framework, queste relazioni possono essere create anche con il codice. Di seguito è riportato un esempio di classi Studente e Iscrizione associate a una relazione uno a molti.

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

Nel codice precedente, puoi vedere che la classe Student contiene la raccolta di Enrollment, ma la classe Enrollment ha un singolo oggetto Student.

Relazione molti-a-molti

Nella relazione molti-a-molti, una riga nella tabella A può avere molte righe corrispondenti nella tabella B e viceversa.

  • È possibile creare tale relazione definendo una terza tabella, chiamata tabella di giunzione, la cui chiave primaria è costituita dalle chiavi esterne sia della tabella A che della tabella B.

  • Ad esempio, le tabelle Studente e Corso hanno una relazione molti-a-molti definita dalla relazione uno-a-molti da ciascuna di queste tabelle alla tabella Iscrizione.

Il codice seguente contiene la classe Course e le due classi precedenti, ovvero Student e 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; }
}

Puoi vedere che sia la classe Course che la classe Student hanno raccolte di oggetti Enrollment che creano una relazione molti-a-molti tramite la classe di giunzione Enrollment.

Rapporto uno a uno

  • In una relazione uno a uno, una riga nella tabella A non può avere più di una riga corrispondente nella tabella B e viceversa.

  • Viene creata una relazione uno a uno se entrambe le colonne correlate sono chiavi primarie o hanno vincoli univoci.

  • In una relazione uno-a-uno, la chiave primaria funge anche da chiave esterna e non esiste una colonna di chiave esterna separata per nessuna delle due tabelle.

Questo tipo di relazione non è comune perché la maggior parte delle informazioni correlate in questo modo sarebbero tutte in una tabella. Potresti usare una relazione uno-a-uno per -

  • Dividi una tabella con molte colonne.
  • Isolare parte di una tabella per motivi di sicurezza.
  • Memorizza dati di breve durata e possono essere facilmente eliminati semplicemente eliminando la tabella.
  • Memorizza le informazioni che si applicano solo a un sottoinsieme della tabella principale.

Il codice seguente serve per aggiungere un altro nome di classe StudentProfile che contiene l'ID e-mail e la password dello studente.

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

Puoi vedere che la classe di entità Student contiene la proprietà di navigazione StudentProfile e StudentProfile contiene la proprietà di navigazione Student.

Ogni studente ha una sola email e password per accedere al dominio dell'università. Queste informazioni possono essere aggiunte alla tabella Studente ma per motivi di sicurezza vengono separate in un'altra tabella.