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.