Designer TPT-Vererbung

In dieser schrittweisen exemplarischen Vorgehensweise wird gezeigt, wie Sie die „Tabelle pro Typ“ (TPT)-Vererbung in Ihrem Modell mithilfe des Entity Framework-Designers (EF Designer) implementieren. Bei der "Tabelle pro Typ"-Vererbung wird eine separate Tabelle in der Datenbank verwendet, um die Daten für nicht geerbte Eigenschaften und Schlüsseleigenschaften für jeden Typ in der Vererbungshierarchie zu verwalten.

In dieser exemplarischen Vorgehensweise ordnen wir die Entitäten Kurs (Basistyp), OnlineKurs (abgeleitet von „Kurs“) und OnsiteKurs (abgeleitet von Kurs) Tabellen mit denselben Namen zu. Wir erstellen ein Modell aus der Datenbank und ändern dann das Modell, um die TPT-Vererbung zu implementieren.

Sie können auch mit Model First beginnen und dann die Datenbank aus dem Modell generieren. Der EF Designer verwendet standardmäßig die TPT-Strategie, sodass jede Vererbung im Modell separaten Tabellen zugeordnet wird.

Weitere Vererbungsoptionen

„Tabelle pro Hierarchie“ (TPH) ist ein anderer Vererbungstyp, in dem eine Datenbanktabelle verwendet wird, um Daten für alle Entitätstypen in einer Vererbungshierarchie zu verwalten.  Informationen zum Zuordnen der „Tabelle pro Hierarchie“-Vererbung mit dem Entitäts-Designer finden Sie unter EF Designer TPH-Vererbung

Beachten Sie, dass die „Tabelle pro konkretem Typ“ (TPC)-Vererbung und gemischte Vererbungsmodelle von der Entity Framework-Laufzeit unterstützt werden, aber nicht vom EF Designer. 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

Für diese exemplarische Vorgehensweise gelten folgende Voraussetzungen:

  • 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 Konsolenvorlage aus.
  • Geben Sie TPTDBFirstSample als Namen ein.
  • Klicken Sie auf OK.

Modellerstellung

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, 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 TPTModel.edmx für den Dateinamen ein, und klicken Sie dann auf Hinzufügen.
  • Wählen Sie im Dialogfeld „Auswählen des Modellinhalts“ die Option **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 Tabellen Abteilung, Kurs, OnlineKurs und OnsiteKurs aus.
  • Klicken Sie auf Fertig stellen.

Der Entity 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.

Implementieren der „Tabelle pro Typ“-Vererbung

  • Klicken Sie auf der Entwurfsoberfläche mit der rechten Maustaste auf den Entitätstyp OnlineKurs, und wählen Sie Eigenschaften aus.
  • Legen Sie im Fenster Eigenschaften die Basistyp-Eigenschaft auf Kurs fest.
  • Klicken Sie mit der rechten Maustaste auf den Entitätstyp OnsiteKurs, und wählen Sie Eigenschaften aus.
  • Legen Sie im Fenster Eigenschaften die Basistyp-Eigenschaft auf Kurs fest.
  • Klicken Sie mit der rechten Maustaste auf die Zuordnung (die Zeile) zwischen den Entitätstypen OnlineKurs und Kurs. Wählen Sie Aus Modell löschen aus.
  • Klicken Sie mit der rechten Maustaste auf die Zuordnung zwischen den Entitätstypen OnsiteKurs und Kurs. Wählen Sie Aus Modell löschen aus.

Wir löschen nun die KursID-Eigenschaft aus OnlineKurs und OnsiteKurs, da diese Klassen KursID vom Basistyp Kurs erben.

  • Klicken Sie mit der rechten Maustaste auf die KursID-Eigenschaft des Entitätstyps OnlineKurs, und wählen Sie dann Aus Model löschen aus.
  • Klicken Sie mit der rechten Maustaste auf die KursID-Eigenschaft des Entitätstyps OnsiteKurs, und wählen Sie dann Aus Model löschen aus.
  • Die "Tabelle pro Typ"-Vererbung ist damit implementiert.

Table Per Type

Verwenden des Modells

Öffnen Sie die Datei Program.cs, in der die Methode Main definiert ist. Fügen Sie der Funktion Main den folgenden Code ein. Der Code führt drei Abfragen aus. Die erste Abfrage gibt alle Kurse zurück, die mit der angegebenen Abteilung zusammenhängen. Die zweite Abfrage verwendet die OfType-Methode, um OnlineKurse im Zusammenhang mit der angegebenen Abteilung zurückzugeben. Die dritte Abfrage gibt OnsiteKurse zurück.

    using (var context = new SchoolEntities())
    {
        foreach (var department in context.Departments)
        {
            Console.WriteLine("The {0} department has the following courses:",
                               department.Name);

            Console.WriteLine("   All courses");
            foreach (var course in department.Courses )
            {
                Console.WriteLine("     {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnlineCourse>())
            {
                Console.WriteLine("   Online - {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnsiteCourse>())
            {
                Console.WriteLine("   Onsite - {0}", course.Title);
            }
        }
    }