Entity Framework - Beziehungen

In relationalen Datenbanken besteht eine Beziehung zwischen relationalen Datenbanktabellen über Fremdschlüssel. Ein Fremdschlüssel (FK) ist eine Spalte oder eine Kombination von Spalten, mit der eine Verbindung zwischen den Daten in zwei Tabellen hergestellt und erzwungen wird. Das folgende Diagramm enthält drei Tabellen.

  • Student
  • Course
  • Enrollment

Im obigen Diagramm sehen Sie eine Art Assoziation / Beziehung zwischen Tabellen. Es gibt drei Arten von Beziehungen zwischen Tabellen, und die Beziehung zwischen verschiedenen Tabellen hängt davon ab, wie die zugehörigen Spalten definiert sind.

  • Eins-zu-viele-Beziehung
  • Viele-zu-Viele-Beziehung
  • Eins-zu-eins-Beziehung

Eins-zu-viele-Beziehung

  • Eine Eins-zu-Viele-Beziehung ist die häufigste Art von Beziehung.

  • In dieser Art von Beziehung kann eine Zeile in Tabelle A viele übereinstimmende Zeilen in Tabelle B haben, aber eine Zeile in Tabelle B kann nur eine übereinstimmende Zeile in Tabelle A haben.

  • Der Fremdschlüssel ist in der Tabelle definiert, die das viele Ende der Beziehung darstellt.

  • In dem obigen Diagramm haben Schüler- und Einschreibungstabellen beispielsweise eine Beziehung zwischen zwei Personen. Jeder Schüler kann viele Einschreibungen haben, aber jede Einschreibung gehört nur einem Schüler.

Im Entity Framework können diese Beziehungen auch mit Code erstellt werden. Im Folgenden finden Sie ein Beispiel für Schüler- und Einschreibungsklassen, die mit einer bis mehreren Beziehungen verknüpft sind.

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

Im obigen Code können Sie sehen, dass die Schülerklasse die Sammlung der Registrierung enthält, die Registrierungsklasse jedoch ein einzelnes Schülerobjekt.

Viele-zu-Viele-Beziehung

In einer Viele-zu-Viele-Beziehung kann eine Zeile in Tabelle A viele übereinstimmende Zeilen in Tabelle B haben und umgekehrt.

  • Sie können eine solche Beziehung erstellen, indem Sie eine dritte Tabelle definieren, die als Junction-Tabelle bezeichnet wird und deren Primärschlüssel aus den Fremdschlüsseln aus Tabelle A und Tabelle B besteht.

  • Beispielsweise haben die Schüler- und Kurstabellen eine Viele-zu-Viele-Beziehung, die durch eine Eins-zu-Viele-Beziehung von jeder dieser Tabellen zur Registrierungstabelle definiert wird.

Der folgende Code enthält die Kursklasse und die beiden oben genannten Klassen, dh Student und 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; }
}

Sie können sehen, dass sowohl die Kursklasse als auch die Schülerklasse über Sammlungen von Registrierungsobjekten verfügen, wodurch über die Junction-Klassenregistrierung eine Beziehung von vielen zu vielen hergestellt wird.

Eins-zu-eins-Beziehung

  • In einer Eins-zu-Eins-Beziehung kann eine Zeile in Tabelle A nicht mehr als eine übereinstimmende Zeile in Tabelle B haben und umgekehrt.

  • Eine Eins-zu-Eins-Beziehung wird erstellt, wenn beide zugehörigen Spalten Primärschlüssel sind oder eindeutige Einschränkungen aufweisen.

  • In einer Eins-zu-Eins-Beziehung fungiert der Primärschlüssel zusätzlich als Fremdschlüssel, und für beide Tabellen gibt es keine separate Fremdschlüsselspalte.

Diese Art von Beziehung ist nicht üblich, da die meisten auf diese Weise zusammenhängenden Informationen alle in einer Tabelle enthalten sind. Sie können eine Eins-zu-Eins-Beziehung zu - verwenden

  • Teilen Sie eine Tabelle mit vielen Spalten.
  • Isolieren Sie aus Sicherheitsgründen einen Teil einer Tabelle.
  • Speichern Sie Daten, die nur von kurzer Dauer sind und durch einfaches Löschen der Tabelle leicht gelöscht werden können.
  • Speichern Sie Informationen, die nur für eine Teilmenge der Haupttabelle gelten.

Der folgende Code dient zum Hinzufügen eines weiteren Klassennamens StudentProfile, der die E-Mail-ID und das Kennwort des Schülers enthält.

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

Sie können sehen, dass die Entitätsklasse Student die Navigationseigenschaft StudentProfile und die Navigationseigenschaft StudentProfile die Navigationseigenschaft Student enthält.

Jeder Student hat nur eine E-Mail-Adresse und ein Passwort, um sich in der Universitätsdomäne anzumelden. Diese Informationen können zur Student-Tabelle hinzugefügt werden, werden jedoch aus Sicherheitsgründen in eine andere Tabelle getrennt.