Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In dieser Schritt-für-Schritt-Anleitung wird gezeigt, wie Sie die TPH-Vererbung (Table-per-Hierarchy) im konzeptionellen Modell mit dem Entity Framework Designer (EF Designer) implementieren. Die TPH-Vererbung verwendet eine Datenbanktabelle, um Daten für alle Entitätstypen in einer Vererbungshierarchie zu verwalten.
In dieser exemplarischen Vorgehensweise ordnen wir die Tabelle "Person" drei Entitätstypen zu: Person (basistyp), "Student" (abgeleitet von "Person") und "Instructor" (abgeleitet von "Person"). Wir erstellen ein konzeptionelles Modell aus der Datenbank (Datenbank zuerst) und ändern dann das Modell, um die TPH-Vererbung mithilfe des EF-Designers zu implementieren.
Es ist möglich, eine TPH-Vererbung mithilfe von Model First zuzuordnen, aber Sie müssen Ihren eigenen Workflow zur Datenbankgenerierung schreiben, der komplex ist. Anschließend weisen Sie diesen Workflow der Workfloweigenschaft "Datenbankgenerierung " im EF-Designer zu. Eine einfachere Alternative ist die Verwendung von Code First.
Weitere Vererbungsoptionen
"Tabelle pro Typ" (TPT) ist ein weiterer Vererbungstyp, bei dem separate Tabellen in der Datenbank Entitäten zugeordnet werden, die an der Vererbung teilnehmen. Informationen zum Zuordnen der Table-per-Type-Vererbung mit dem EF-Designer finden Sie unter EF Designer TPT-Vererbung.
Tabellen-für-konkreten-Typ-Vererbung (TPC) und gemischte Vererbungsmodelle werden von der Entity Framework-Laufzeit unterstützt, jedoch nicht vom EF Designer unterstützt. Wenn Sie TPC oder gemischte Vererbung verwenden möchten, haben Sie zwei Optionen: Verwenden Sie Code First, oder bearbeiten Sie die EDMX-Datei manuell. Wenn Sie sich für die Arbeit mit der EDMX-Datei entscheiden, wird das Fenster "Zuordnungsdetails" in den abgesicherten Modus versetzt, und Sie können den Designer nicht verwenden, um die Zuordnungen zu ändern.
Voraussetzungen
Um diese exemplarische Vorgehensweise abzuschließen, benötigen Sie:
- Eine aktuelle Version von Visual Studio.
- Die Beispieldatenbank School.
Einrichten des Projekts
- Öffnen Sie Visual Studio 2012.
- Wählen Sie Datei-> Neu-> Projekt aus.
- Klicken Sie im linken Bereich auf Visual C#, und wählen Sie dann die Vorlage Konsole aus.
- Geben Sie TPHDBFirstSample als Namen ein.
- Wählen Sie OK aus.
Modellerstellung
- Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie "Hinzufügen –> Neues Element" aus.
- Wählen Sie Daten im linken Menü aus, und wählen Sie dann im Bereich „Vorlagen“ ADO.NET Entity Data Model aus.
- Geben Sie TPHModel.edmx für den Dateinamen ein, und klicken Sie dann auf "Hinzufügen".
- Wählen Sie im Dialogfeld „Modellinhalt auswählen“ Aus Datenbank generieren aus, und klicken Sie dann auf Weiter.
- Klicken Sie auf Neue Verbindung. Geben Sie im Dialogfeld „Verbindungseigenschaften“ den Servernamen ein (z. B. (localdb)\mssqllocaldb), wählen Sie die Authentifizierungsmethode aus, geben Sie School als Datenbanknamen ein, und klicken Sie dann auf OK. Das Dialogfeld „Datenverbindung auswählen“ wird mit Ihrer Datenbankverbindungseinstellung aktualisiert.
- Wählen Sie im Dialogfeld "Datenbankobjekte auswählen" unter dem Knoten "Tabellen" die Tabelle " Person " aus.
- Klicken Sie auf Fertig stellen.
Der Entitäts-Designer, der eine Entwurfsoberfläche zum Bearbeiten des Modells bereitstellt, wird angezeigt. Alle Objekte, die Sie im Dialogfeld "Datenbankobjekte auswählen" ausgewählt haben, werden dem Modell hinzugefügt.
So sieht die Tabelle " Person " in der Datenbank aus.
Implementierung der Vererbung über Hierarchien pro Tabelle
Die Tabelle " Person " weist die Spalte "Diskriminator" auf , die einen von zwei Werten aufweisen kann: "Student" und "Instructor". Je nach Wert wird die Tabelle " Person " der Entität "Student " oder der Entität "Kursleiter " zugeordnet. Die Tabelle " Person " verfügt außerdem über zwei Spalten, "HireDate " und "EnrollmentDate", die NULL-Werte erfordern müssen, da eine Person nicht gleichzeitig Schüler und Kursleiter sein kann (zumindest nicht in dieser exemplarischen Vorgehensweise).
Hinzufügen neuer Entitäten
- Fügen Sie eine neue Entität hinzu. Klicken Sie dazu mit der rechten Maustaste auf einen leeren Bereich der Entwurfsoberfläche des Entity Framework-Designers, und wählen Sie "Add-Entity>" aus.
- Geben Sie "Instructor " für den Entitätsnamen ein, und wählen Sie " Person " aus der Dropdownliste für den Basistyp aus.
- Klicke auf OK.
- Fügen Sie eine weitere neue Entität hinzu. Geben Sie "Student " für den Entitätsnamen ein, und wählen Sie " Person " aus der Dropdownliste für den Basistyp aus.
Der Entwurfsoberfläche wurden zwei neue Entitätstypen hinzugefügt. Ein Pfeil zeigt von den neuen Entitätstypen auf den Entitätstyp "Person "; dies gibt an, dass Person der Basistyp für die neuen Entitätstypen ist.
- Klicken Sie mit der rechten Maustaste auf die Eigenschaft "HireDate" der Person-Entität . Wählen Sie "Ausschneiden" aus (oder verwenden Sie die taste Ctrl-X).
- Klicken Sie mit der rechten Maustaste auf die Entität "Kursleiter ", und wählen Sie "Einfügen" aus (oder verwenden Sie die taste Ctrl-V).
- Klicken Sie mit der rechten Maustaste auf die Eigenschaft "HireDate ", und wählen Sie "Eigenschaften" aus.
- Legen Sie im Eigenschaftenfenster die Nullable-Eigenschaft auf false fest.
- Klicken Sie mit der rechten Maustaste auf die Eigenschaft EnrollmentDate der Entität Person. Wählen Sie "Ausschneiden" aus (oder verwenden Sie die taste Ctrl-X).
- Klicken Sie mit der rechten Maustaste auf die Entität "Student ", und wählen Sie "Einfügen" aus(oder verwenden Sie die taste Ctrl-V).
- Wählen Sie die EnrollmentDate-Eigenschaft aus, und legen Sie die Nullable-Eigenschaft auf "false" fest.
- Wählen Sie den Entitätstyp "Person " aus. Legen Sie im Eigenschaftenfenster die abstrakte Eigenschaft auf "true" fest.
- Löschen Sie die Diskriminator-Eigenschaft von Person. Der Grund, warum er gelöscht werden soll, wird im folgenden Abschnitt erläutert.
Zuordnen der Entitäten
Klicken Sie mit der rechten Maustaste auf den Kursleiter , und wählen Sie "Tabellenzuordnung" aus. Die Entität "Kursleiter" ist im Fenster "Zuordnungsdetails" ausgewählt.
Klicken Sie im Fenster <" auf ">Tabelle oder Ansicht hinzufügen". Das <Feld "Tabelle oder Ansicht> hinzufügen" wird zu einer Dropdownliste mit Tabellen oder Ansichten, denen die ausgewählte Entität zugeordnet werden kann.
Wählen Sie "Person " aus der Dropdownliste aus.
Das Fenster "Zuordnungsdetails " wird mit Standardspaltenzuordnungen und einer Option zum Hinzufügen einer Bedingung aktualisiert.
Klicken Sie auf "<Bedingung> hinzufügen". Das <Feld "Bedingung> hinzufügen" wird zu einer Dropdownliste mit Spalten, für die Bedingungen festgelegt werden können.
Wählen Sie "Diskriminator " aus der Dropdownliste aus.
Wählen Sie in der Spalte Operator des Fensters Zuordnungsdetails in der Dropdown-Liste "=" aus.
Geben Sie in der Spalte "Wert/Eigenschaft " den Typ "Instructor" ein. Das Endergebnis sollte wie folgt aussehen:
Wiederholen Sie diese Schritte für den Entitätstyp "Student ", aber legen Sie die Bedingung gleich dem Wert "Student " fest.
Der Grund, warum wir die Diskriminator-Eigenschaft entfernen möchten, liegt daran, dass Sie eine Tabellenspalte nicht mehrmals zuordnen können. Diese Spalte wird für die bedingte Zuordnung verwendet, daher kann sie nicht auch für die Eigenschaftszuordnung verwendet werden. Die einzige Möglichkeit, dieses für beide zu verwenden, besteht darin, dass eine Bedingung einen Is Null- oder Is Not Null-Vergleich verwendet.
Die Table-per-Hierarchy-Vererbung ist jetzt implementiert.
Modell verwenden
Öffnen Sie die Datei Program.cs, in der die Methode Main definiert ist. Fügen Sie den folgenden Code in die Hauptfunktion ein. Der Code führt drei Abfragen aus. Die erste Abfrage gibt alle Personenobjekte zurück. Die zweite Abfrage verwendet die OfType-Methode , um Instructor-Objekte zurückzugeben. Die dritte Abfrage verwendet die OfType-Methode , um Student-Objekte zurückzugeben.
using (var context = new SchoolEntities())
{
Console.WriteLine("All people:");
foreach (var person in context.People)
{
Console.WriteLine(" {0} {1}", person.FirstName, person.LastName);
}
Console.WriteLine("Instructors only: ");
foreach (var person in context.People.OfType<Instructor>())
{
Console.WriteLine(" {0} {1}", person.FirstName, person.LastName);
}
Console.WriteLine("Students only: ");
foreach (var person in context.People.OfType<Student>())
{
Console.WriteLine(" {0} {1}", person.FirstName, person.LastName);
}
}