Designer-TPH-VererbungDesigner TPH Inheritance

Diese schrittweise exemplarische Vorgehensweise veranschaulicht, wie Sie die "Tabelle pro Hierarchie"-Vererbung (TPH) im konzeptionellen Modell mit dem Entity Framework Designer (EF-Designer) implementieren.This step-by-step walkthrough shows how to implement table-per-hierarchy (TPH) inheritance in your conceptual model with the Entity Framework Designer (EF Designer). Die TPH-Vererbung verwendet eine Datenbanktabelle, um Daten für alle Entitäts Typen in einer Vererbungs Hierarchie zu verwalten.TPH inheritance uses one database table to maintain data for all of the entity types in an inheritance hierarchy.

In dieser exemplarischen Vorgehensweise ordnen wir die Person-Tabelle drei Entitäts Typen zu: Person (der Basistyp), Student (abgeleitet von Person) und Instructor (abgeleitet von Person).In this walkthrough we will map the Person table to three entity types: Person (the base type), Student (derives from Person), and Instructor (derives from Person). Wir erstellen ein konzeptionelles Modell aus der Datenbank (Database First) und ändern dann das Modell, um die TPH-Vererbung mit dem EF-Designer zu implementieren.We'll create a conceptual model from the database (Database First) and then alter the model to implement the TPH inheritance using the EF Designer.

Es ist möglich, eine TPH-Vererbung mithilfe Model First zuzuordnen, aber Sie müssen einen komplexen Daten Bank Generierungs Workflow schreiben, der Komplex ist.It is possible to map to a TPH inheritance using Model First but you would have to write your own database generation workflow which is complex. Anschließend weisen Sie diesen Workflow der Eigenschaft Daten Bank Generierungs Workflow im EF-Designer zu.You would then assign this workflow to the Database Generation Workflow property in the EF Designer. Eine einfachere Alternative ist die Verwendung von Code First.An easier alternative is to use Code First.

Andere Vererbungs OptionenOther Inheritance Options

Tabelle pro Typ (TPT) ist eine andere Art von Vererbung, bei der separate Tabellen in der Datenbank Entitäten zugeordnet werden, die an der Vererbung teilnehmen.Table-per-Type (TPT) is another type of inheritance in which separate tables in the database are mapped to entities that participate in the inheritance. Informationen zum Zuordnen der "Tabelle pro Typ"-Vererbung mit dem EF-Designer finden Sie unter EF-Designer-TPT-Vererbung. For information about how to map Table-per-Type inheritance with the EF Designer, see EF Designer TPT Inheritance.

"Tabelle pro konkrete Typvererbung" (TPC) und gemischte Vererbungs Modelle werden von der Entity Framework Runtime unterstützt, jedoch nicht vom EF-Designer unterstützt.Table-per-Concrete Type Inheritance (TPC) and mixed inheritance models are supported by the Entity Framework runtime but are not supported by the EF Designer. Wenn Sie TPC oder gemischte Vererbung verwenden möchten, haben Sie zwei Möglichkeiten: Verwenden Sie Code First, oder bearbeiten Sie die EDMX-Datei manuell.If you want to use TPC or mixed inheritance, you have two options: use Code First, or manually edit the EDMX file. Wenn Sie sich für die Arbeit mit der EDMX-Datei entscheiden, wird das Fenster Mappingdetails in den "abgesicherten Modus" versetzt, und Sie können den Designer nicht verwenden, um die Zuordnungen zu ändern.If you choose to work with the EDMX file, the Mapping Details Window will be put into “safe mode” and you will not be able to use the designer to change the mappings.

VoraussetzungenPrerequisites

Um die exemplarische Vorgehensweise nachzuvollziehen, benötigen Sie Folgendes:To complete this walkthrough, you will need:

Einrichten des ProjektsSet up the Project

  • Öffnen Sie Visual Studio 2012.Open Visual Studio 2012.
  • Wählen Sie Datei- > neu- > Projekt aus.Select File-> New -> Project
  • Klicken Sie im linken Bereich auf **Visual C # **, und wählen Sie dann die Konsolen Vorlage aus.In the left pane, click Visual C#, and then select the Console template.
  • Geben Sie tphdbfirstsample   als Name ein.Enter TPHDBFirstSample as the name.
  • Wählen Sie OK aus.Select OK.

ModellerstellungCreate a Model

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Add- > New Itemaus.Right-click the project name in Solution Explorer, and select Add -> New Item.
  • Wählen Sie im linken Menü Daten aus, und wählen Sie dann im Bereich Vorlagen die Option ADO.NET Entity Data Model aus.Select Data from the left menu and then select ADO.NET Entity Data Model in the Templates pane.
  • Geben Sie als Dateiname tphmodel. edmx ein, und klicken Sie dann auf Hinzufügen.Enter TPHModel.edmx for the file name, and then click Add.
  • Wählen Sie im Dialogfeld Modell Inhalte auswählen die Option aus Datenbank generieren aus, und klicken Sie dann auf weiter.In the Choose Model Contents dialog box, select Generate from database, and then click Next.
  • Klicken Sie auf neue Verbindung.Click New Connection. Geben Sie im Dialogfeld Verbindungs Eigenschaften den Servernamen ein (z. b. (localdb) \ mssqllocaldb), wählen Sie die Authentifizierungsmethode aus, geben Sie School   als Datenbanknamen School ein, und klicken Sie dann auf OK.In the Connection Properties dialog box, enter the server name (for example, (localdb)\mssqllocaldb), select the authentication method, type School for the database name, and then click OK. Das Dialogfeld Wählen Sie Ihre Datenverbindung aus wird mit Ihrer Daten bankverbindungs Einstellung aktualisiert.The Choose Your Data Connection dialog box is updated with your database connection setting.
  • Wählen Sie im Dialogfeld Datenbankobjekte auswählen unter dem Knoten Tabellen die Person -Tabelle aus.In the Choose Your Database Objects dialog box, under the Tables node, select the Person table.
  • Klicken Sie auf Finish.Click Finish.

Die Entity Designer, die eine Entwurfs Oberfläche zum Bearbeiten des Modells bereitstellt, wird angezeigt.The Entity Designer, which provides a design surface for editing your model, is displayed. Alle Objekte, die Sie im Dialogfeld Wählen Sie Ihre Datenbankobjekte ausgewählt haben, werden dem Modell hinzugefügt.All the objects that you selected in the Choose Your Database Objects dialog box are added to the model.

So sucht die Person -Tabelle in der Datenbank.That is how the Person table looks in the database.

Person-Tabelle 

Implementieren der "Tabelle pro Hierarchie"-VererbungImplement Table-per-Hierarchy Inheritance

Die Person -Tabelle verfügt über die diskriminatorspalte , die einen von zwei Werten aufweisen kann: "Student" und "Instructor".The Person table has the Discriminator column, which can have one of two values: “Student” and “Instructor”. Abhängig vom Wert wird die Person -Tabelle der Student -Entität oder der Instructor -Entität zugeordnet.Depending on the value the Person table will be mapped to the Student entity or the Instructor entity. Die Person -Tabelle verfügt auch über zwei Spalten, HireDate   und registrimentdate, die NULL-Werte zulassen müssen, da eine Person nicht gleichzeitig Student und Dozenten sein kann (zumindest nicht in dieser exemplarischen Vorgehensweise).The Person table also has two columns, HireDate and EnrollmentDate, which must be nullable because a person cannot be a student and an instructor at the same time (at least not in this walkthrough).

Neue Entitäten hinzufügenAdd new Entities

  • Fügen Sie eine neue Entität hinzu.Add a new entity. Klicken Sie dazu mit der rechten Maustaste auf einen leeren Bereich der Entwurfs Oberfläche der Entity Framework Designer, und wählen Sie Add- > Entityaus.To do this, right-click on an empty space of the design surface of the Entity Framework Designer, and select Add->Entity.
  • Geben Sie Instructor   als Entitäts Nameein,   und wählen Sie in Person   der Dropdown Liste für den BasistypPerson aus.Type Instructor for the Entity name and select Person from the drop-down list for the Base type.
  • Klicken Sie auf OK.Click OK.
  • Fügen Sie eine neue Entität hinzu.Add another new entity. Geben Sie Student   als Entitäts Nameein,   und wählen Sie in Person   der Dropdown Liste für den BasistypPerson aus.Type Student for the Entity name and select Person from the drop-down list for the Base type.

Der Entwurfs Oberfläche wurden zwei neue Entitäts Typen hinzugefügt.Two new entity types were added to the design surface. Ein Pfeil zeigt von den neuen Entitäts Typen auf Personden   Entitätstyp Person. Dies deutet darauf hin, dass Person   der Basistyp für die neuen Entitäts Typen ist.An arrow points from the new entity types to the Person entity type; this indicates that Person is the base type for the new entity types.

  • Klicken Sie mit der rechten Maustaste auf die Eigenschaft HireDate   der Person-   Entität.Right-click the HireDate property of the Person entity. Wählen Sie Ausschneiden (oder drücken Sie STRG + X).Select Cut (or use the Ctrl-X key).
  • Klicken Sie mit der Instructorrechten Maustaste auf die   Entität Instructor, und wählen Sie Einfügen aus (oder drücken Sie STRG + V).Right-click the Instructor entity and select Paste (or use the Ctrl-V key).
  • Klicken Sie mit der rechten Maustaste auf die Eigenschaft HireDate,   und wählen Sie Eigenschaften.Right-click the HireDate property and select Properties.
  •  Properties   Legen Sie im Fenster Eigenschaften die Eigenschaft Nullable   auf falsefest.In the Properties window, set the Nullable property to false.
  • Klicken Sie mit der rechten Maustaste auf die Eigenschaft registrimentdate   der Person-   Entität.Right-click the EnrollmentDate property of the Person entity. Wählen Sie Ausschneiden (oder drücken Sie STRG + X).Select Cut (or use the Ctrl-X key).
  • Klicken Sie mit der rechten Maustaste auf die Entität Student , und wählen Sie Einfügen aus (oder drücken Sie STRG + V).Right-click the Student entity and select Paste(or use the Ctrl-V key).
  • Wählen Sie die Eigenschaft registrimentdateaus   , und legen Sie die Eigenschaft Nullable   auf falsefest.Select the EnrollmentDate property and set the Nullable property to false.
  • Wählen Sie Personden   Entitätstyp Person aus.Select the Person entity type.  Properties   Legen Sie im Fenster Eigenschaften die abstrakte   Eigenschaft auf truefest.In the Properties window, set its Abstract property to true.
  • Löschen Sie die diskriminatoreigenschaft von Person.Delete the Discriminator property from Person. Der Grund für das Löschen sollte im folgenden Abschnitt erläutert werden.The reason it should be deleted is explained in the following section.

Zuordnen der EntitätenMap the entities

  • Klicken Sie mit der rechten Maustaste auf den Dozenten und wählen Sie Tabellen Zuordnung.Right-click the Instructor and select Table Mapping. Die Entität "Instructor" ist im Fenster "Mappingdetails" ausgewählt.The Instructor entity is selected in the Mapping Details window.

  • Klicken Sie im Fenster Mappingdetails auf ** < Tabelle oder Sicht > Hinzufügen**    Mapping Details   .Click <Add a Table or View> in the Mapping Details window. Das Feld ** < Tabelle oder Sicht > Hinzufügen**   wird zu einer Dropdown Liste von Tabellen oder Sichten, denen die ausgewählte Entität zugeordnet werden kann.The <Add a Table or View> field becomes a drop-down list of tables or views to which the selected entity can be mapped.

  • Wählen PersonSie in   der Dropdown Liste Person aus.Select Person from the drop-down list.

  • Das Fenster Mappingdetails   wird mit Standard Spalten Zuordnungen und einer Option zum Hinzufügen einer Bedingung aktualisiert.The Mapping Details window is updated with default column mappings and an option for adding a condition.

  • Klicken Sie auf ** < Bedingung > Hinzufügen**.Click on <Add a Condition>. Das Feld ** < Bedingung > Hinzufügen**   wird zu einer Dropdown Liste von Spalten, für die Bedingungen festgelegt werden können.The <Add a Condition> field becomes a drop-down list of columns for which conditions can be set.

  • Wählen Sie in der Dropdown Liste die Option Diskriminator   aus.Select Discriminator from the drop-down list.

  • Wählen Sie in der Spalte Operator   des Fensters Mappingdetailsin   der Dropdown Liste die Option = aus.In the Operator column of the Mapping Details window, select = from the drop-down list.

  • Geben Sie in der Spalte Wert/Eigenschaft den Wert  Instructorein.In the Value/Property column, type Instructor. Das Endergebnis sollte wie folgt aussehen:The end result should look like this:

    Mappingdetails

  • Wiederholen Sie diese Schritte Studentfür den   Entitätstyp "Student", aber legen Sie den Wert für " Student " fest.Repeat these steps for the Student entity type, but make the condition equal to Student value.
    Der Grund, warum wir die diskriminatoreigenschaft entfernen wollten, liegt darin, dass Sie eine Tabellenspalte nicht mehrmals zuordnen können. Diese Spalte wird für die bedingte Zuordnung verwendet und kann daher nicht auch für die Eigenschaften Zuordnung verwendet werden. Die einzige Möglichkeit, die für beides verwendet werden kann, wenn eine Bedingung einen is NULL-   oder is not NULL-   Vergleich verwendet.The reason we wanted to remove the Discriminator property, is because you cannot map a table column more than once. This column will be used for conditional mapping, so it cannot be used for property mapping as well. The only way it can be used for both, if a condition uses an Is Null or Is Not Null comparison.

Die "Tabelle pro Hierarchie"-Vererbung ist jetzt implementiert.Table-per-hierarchy inheritance is now implemented.

Endgültige TPH

Verwenden des ModellsUse the Model

Öffnen Sie die Datei Program.cs , in der die Main -Methode definiert ist.Open the Program.cs file where the Main method is defined. Fügen Sie den folgenden Code in die Main -Funktion ein.Paste the following code into the Main function. Der Code führt drei Abfragen aus.The code executes three queries. Die erste Abfrage führt alle Person -Objekte zurück.The first query brings back all Person objects. Die zweite Abfrage verwendet die OfType -Methode, um Instructor -Objekte zurückzugeben.The second query uses the OfType method to return Instructor objects. Die dritte Abfrage verwendet die OfType -Methode, um Student -Objekte zurückzugeben.The third query uses the OfType method to return Student objects.

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