Designer-TPT-VererbungDesigner TPT Inheritance

In dieser schrittweisen exemplarischen Vorgehensweise wird veranschaulicht, wie Sie die "Tabelle pro Typ"-Vererbung (TPT) in Ihrem Modell mithilfe der Entity Framework Designer (EF-Designer) implementieren.This step-by-step walkthrough shows how to implement table-per-type (TPT) inheritance in your model using the Entity Framework Designer (EF Designer). 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.Table-per-type inheritance uses a separate table in the database to maintain data for non-inherited properties and key properties for each type in the inheritance hierarchy.

In dieser exemplarischen Vorgehensweise ordnen wir die Entitäten Course (Basistyp), OnlineCourse (abgeleitet von Course) und OnsiteCourse   (abgeleitet von Course) auf Tabellen mit denselben Namen zu.In this walkthrough we will map the Course (base type), OnlineCourse (derives from Course), and OnsiteCourse (derives from Course) entities to tables with the same names. Wir erstellen ein Modell aus der Datenbank und ändern dann das Modell, um die TPT-Vererbung zu implementieren.We'll create a model from the database and then alter the model to implement the TPT inheritance.

Sie können auch mit dem Model First beginnen und dann die Datenbank aus dem Modell generieren.You can also start with the Model First and then generate the database from the model. Der EF-Designer verwendet standardmäßig die TPT-Strategie, sodass jede Vererbung im Modell separaten Tabellen zugeordnet wird.The EF Designer uses the TPT strategy by default and so any inheritance in the model will be mapped to separate tables.

Andere Vererbungs OptionenOther Inheritance Options

Tabelle pro Hierarchie (TPH) ist eine andere Art von Vererbung, bei der eine Datenbanktabelle verwendet wird, um Daten für alle Entitäts Typen in einer Vererbungs Hierarchie zu verwalten.Table-per-Hierarchy (TPH) is another type of inheritance in which one database table is used to maintain data for all of the entity types in an inheritance hierarchy.Informationen zum Zuordnen der "Tabelle pro Hierarchie"-Vererbung mit dem Entity Designer finden Sie unter EF-Designer-TPH-Vererbung.  For information about how to map Table-per-Hierarchy inheritance with the Entity Designer, see EF Designer TPH Inheritance. 

Beachten Sie, dass die Tabelle pro konkrete Typvererbung (TPC) und gemischte Vererbungs Modelle von der Entity Framework Runtime unterstützt werden, jedoch nicht vom EF-Designer unterstützt werden.Note that, the 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 tptdbfirstsample   als Name ein.Enter TPTDBFirstSample as the name.
  • Wählen Sie OK aus.Select OK.

ModellerstellungCreate a Model

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add- > New Itemaus.Right-click the project 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 tptmodel. edmx ein, und klicken Sie dann auf Hinzufügen.Enter TPTModel.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 Tabellen " Department", " Course", "OnlineCourse" und "OnsiteCourse " aus.In the Choose Your Database Objects dialog box, under the Tables node, select the Department, Course, OnlineCourse, and OnsiteCourse tables.
  • 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.

"Tabelle pro Typ"-Vererbung implementierenImplement Table-per-Type Inheritance

  • Klicken Sie auf der Entwurfs Oberfläche mit der rechten Maustaste auf den Entitätstyp OnlineCourse , und wählen Sie Eigenschaftenaus.On the design surface, right-click the OnlineCourse entity type and select Properties.
  • Legen Sie im Fenster Eigenschaften die Eigenschaft Basistyp auf Kursfest.In the Properties window, set the Base Type property to Course.
  • Klicken Sie mit der rechten Maustaste auf den Entitätstyp OnsiteCourse und wählen Sie Eigenschaften.Right-click the OnsiteCourse entity type and select Properties.
  • Legen Sie im Fenster Eigenschaften die Eigenschaft Basistyp auf Kursfest.In the Properties window, set the Base Type property to Course.
  • Klicken Sie mit der rechten Maustaste auf die Zuordnung (die Linie) zwischen den Entitäts Typen OnlineCourse und Course .Right-click the association (the line) between the OnlineCourse and Course entity types. Wählen Sie aus Modell löschen aus.Select Delete from Model.
  • Klicken Sie mit der rechten Maustaste auf die Zuordnung zwischen den Entitäts Typen OnsiteCourse und Course .Right-click the association between the OnsiteCourse and Course entity types. Wählen Sie aus Modell löschen aus.Select Delete from Model.

Wir löschen jetzt die CourseID -Eigenschaft aus " OnlineCourse " und " OnsiteCourse ", da diese Klassen CourseID vom Course -Basistyp erben.We will now delete the CourseID property from OnlineCourse and OnsiteCourse because these classes inherit CourseID from the Course base type.

  • Klicken Sie mit der rechten Maustaste auf die Eigenschaft CourseID des Entitäts Typs OnlineCourse , und wählen Sie dann aus Modell löschen aus.Right-click the CourseID property of the OnlineCourse entity type, and then select Delete from Model.
  • Klicken Sie mit der rechten Maustaste auf die Eigenschaft CourseID des Entitäts Typs OnsiteCourse , und wählen Sie dann aus Modell löschen aus .Right-click the CourseID property of the OnsiteCourse entity type, and then select Delete from Model
  • Die "Tabelle pro Typ"-Vererbung ist damit implementiert.Table-per-type inheritance is now implemented.

Tabelle pro Typ

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 Kurse zurück, die mit der angegebenen Abteilung verknüpft sind.The first query brings back all Courses related to the specified department. In der zweiten Abfrage wird die OfType -Methode verwendet, um OnlineCourses zurückzugeben, die mit der angegebenen Abteilung verknüpft sind.The second query uses the OfType method to return OnlineCourses related to the specified department. Die dritte Abfrage gibt " OnsiteCourses" zurück.The third query returns OnsiteCourses.

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