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.