Entity Framework - relacje
W relacyjnych bazach danych relacja to sytuacja, która istnieje między tabelami relacyjnej bazy danych za pośrednictwem kluczy obcych. Klucz obcy (FK) to kolumna lub kombinacja kolumn używana do ustanawiania i wymuszania połączenia między danymi w dwóch tabelach. Poniższy diagram zawiera trzy tabele.
- Student
- Course
- Enrollment
 
                Na powyższym diagramie można zobaczyć pewne powiązania / relacje między tabelami. Istnieją trzy typy relacji między tabelami, a relacje między różnymi tabelami zależą od sposobu zdefiniowania powiązanych kolumn.
- Relacja jeden do wielu
- Relacja wiele do wielu
- Relacja jeden do jednego
Relacja jeden do wielu
- Relacja jeden do wielu jest najczęstszym rodzajem relacji. 
- W tego typu relacji wiersz w tabeli A może mieć wiele pasujących wierszy w tabeli B, ale wiersz w tabeli B może mieć tylko jeden pasujący wiersz w tabeli A. 
- Klucz obcy jest zdefiniowany w tabeli reprezentującej wiele końców relacji. 
- Na przykład na powyższym diagramie tabele Uczeń i Rejestracja mają relację jeden-wiele, każdy uczeń może mieć wiele zapisów, ale każda rejestracja należy do tylko jednego ucznia. 
W ramach encji te relacje można również utworzyć za pomocą kodu. Poniżej przedstawiono przykład zajęć dla uczniów i studentów, które są powiązane z relacją jeden do wielu.
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; }
}W powyższym kodzie widać, że klasa Student zawiera kolekcję Enrollment, ale klasa Enrollment ma jeden obiekt Student.
Relacja wiele do wielu
W relacji wiele-do-wielu wiersz w tabeli A może mieć wiele pasujących wierszy w tabeli B i odwrotnie.
- Możesz utworzyć taką relację, definiując trzecią tabelę, zwaną tabelą skrzyżowań, której klucz podstawowy składa się z kluczy obcych z tabeli A i tabeli B. 
- Na przykład tabele Student i Course mają relację wiele do wielu, która jest zdefiniowana przez relację jeden do wielu z każdej z tych tabel do tabeli Enrollment. 
Poniższy kod zawiera klasę Course i dwie powyższe klasy, tj. Student i 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; }
}Możesz zobaczyć, że zarówno klasa Course, jak i klasa Student mają kolekcje obiektów Enrollment, które tworzą relację wiele do wielu za pośrednictwem klasy skrzyżowania Enrollment.
Relacja jeden do jednego
- W relacji jeden do jednego wiersz w tabeli A może mieć nie więcej niż jeden pasujący wiersz w tabeli B i odwrotnie. 
- Relacja jeden do jednego jest tworzona, jeśli obie powiązane kolumny są kluczami podstawowymi lub mają unikatowe ograniczenia. 
- W relacji jeden do jednego klucz podstawowy działa dodatkowo jako klucz obcy i nie ma oddzielnej kolumny klucza obcego dla żadnej z tabel. 
Ten typ relacji nie jest powszechny, ponieważ większość informacji powiązanych w ten sposób znajduje się w jednej tabeli. Możesz użyć relacji jeden do jednego, aby -
- Podziel tabelę na wiele kolumn.
- Oddziel część tabeli ze względów bezpieczeństwa.
- Przechowuj dane, które są krótkotrwałe i można je łatwo usunąć, po prostu usuwając tabelę.
- Przechowuj informacje, które dotyczą tylko podzbioru tabeli głównej.
Poniższy kod służy do dodania innej nazwy klasy StudentProfile, która zawiera identyfikator e-mail ucznia i hasło.
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; }
}Możesz zobaczyć, że klasa jednostki Student zawiera właściwość nawigacji StudentProfile, a StudentProfile zawiera właściwość nawigacji Student.
Każdy student ma tylko jeden adres e-mail i hasło do logowania się w domenie uniwersyteckiej. Te informacje można dodać do tabeli Ucznia, ale ze względów bezpieczeństwa są one oddzielane do innej tabeli.