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.