Freigeben über


Exemplarische Vorgehensweise: Mappingvererbung – 'Tabelle pro Hierarchie'

In diesem Thema wird dargestellt, wie die "Tabelle pro Hierarchie"-Vererbung durch Ändern des konzeptionellen Modells in einem Entity Data Model (EDM) implementiert wird. Die "Tabelle pro Hierarchie"-Vererbung verwendet eine Datenbanktabelle, um die Daten aller Entitätstypen in einer Vererbungshierarchie zu verwalten. Weitere Informationen zum Implementieren von Vererbung mit einem EDM finden Sie unter Vererbung (EDM).

In dieser exemplarischen Vorgehensweise implementieren Sie die "Tabelle pro Hierarchie"-Vererbung, indem Sie das in der Anwendung "CourseManager" (weitere Informationen finden Sie weiter unten in diesem Thema im Abschnitt "Erforderliche Komponenten") verwendete Entity Data Model (EDM) ändern.

Im CourseManager-EDM verfügt der Person-Entitätstyp über zwei Eigenschaften, HireDate und EnrollmentDate, die zu neuen, von Person erbenden Entitätstypen (Instructor bzw. Student) gehören können. In den folgenden Schritten wird zusammengefasst, wie die "Tabelle pro Hierarchie"-Vererbung in diesem Fall implementiert wird. Die Verfahren in dieser exemplarischen Vorgehensweise bieten weitergehende Informationen.

  1. Erstellen Sie zwei neue Entitätstypen, Instructor und Student.

  2. Legen Sie den Basistyp für jeden neuen Entitätstyp auf Person fest.

  3. Verschieben Sie die HireDate-Eigenschaft von Person nach Instructor, und verschieben Sie die EnrollmentDate-Eigenschaft von Person nach Student.

  4. Machen Sie den Person-Entitätstyp zu einem abstrakten Typ.

  5. Ordnen Sie der Tabelle Person den Instructor-Entitätstyp mit zwei Bedingungen zu: HireDate Is Not Null und EnrollmentDate Is Null.

  6. Ordnen Sie der Tabelle Person den Student-Entitätstyp mit zwei Bedingungen zu: EnrollmentDate Is Not Null und HireDate Is Null.

Erforderliche Komponenten

Um diese exemplarische Vorgehensweise durchzuführen, müssen Sie die Anwendung "CourseManager" erstellen. Weitere Informationen und Anweisungen finden Sie im Entity Framework-Schnellstart. Nachdem Sie diese Anwendung erstellt haben, ändern Sie das zugehörige EDM, indem Sie die "Tabelle pro Hierarchie"-Vererbung implementieren. Erweitern Sie dann die Funktionalität der Anwendung, um die Registrierung für einen ausgewählten Kurs anzuzeigen.

NoteHinweis

Da viele der exemplarischen Vorgehensweisen in dieser Dokumentation die Anwendung "CourseManager" als Ausgangspunkt verwenden, wird empfohlen, für diese exemplarische Vorgehensweise eine Kopie der Anwendung "CourseManager" zu verwenden und nicht den ursprünglichen Code von CourseManager zu bearbeiten.

In dieser exemplarischen Vorgehensweise wird davon ausgegangen, dass Sie über grundlegende Kenntnisse in Visual Studio, .NET Framework und in der Visual C#- oder Visual Basic-Programmierung verfügen.

Implementieren der "Tabelle pro Hierarchie"-Vererbung

In diesem Verfahren ändern Sie den konzeptionellen Teil des SchoolModel-EDM, um die "Tabelle pro Hierarchie"-Vererbung zu implementieren.

So implementieren Sie die "Tabelle pro Hierarchie"-Vererbung

  1. Öffnen Sie in Visual Studio die Projektmappe CourseManager.

  2. Doppelklicken Sie im Projektmappen-Explorer auf die Datei School.edmx.

    Die Datei School.edmx wird im ADO.NET Entity Data Model-Designer (Entity Designer) geöffnet.

  3. Klicken Sie mit der rechten Maustaste auf einen leeren Bereich der Entwurfsoberfläche des Entity Designers, zeigen Sie mit dem Mauszeiger auf Hinzufügen, und klicken Sie auf Entität.

    Das Dialogfeld Neue Entität wird angezeigt.

  4. Geben Sie Instructor als Entitätsnamen ein, und wählen Sie in der Dropdownliste Person als Basistyp aus.

  5. Klicken Sie auf OK.

    Auf der Entwurfsoberfläche wird ein neuer Entitätstyp erstellt und angezeigt.

  6. Wiederholen Sie die Schritte 3 bis 5, geben Sie jedoch im zweiten Schritt Student für den Entitätsnamen ein.

    Sie haben nun zwei neue Entitätstypen, Instructor und Student, die auf der Entwurfsoberfläche angezeigt werden. Pfeile zeigen von den neuen Entitätstypen auf den Person-Entitätstyp. Dadurch wird angezeigt, dass Person der Basistyp der neuen Entitätstypen ist.

  7. Klicken Sie mit der rechten Maustaste auf die HireDate-Eigenschaft (unter Skalareigenschaften) des Person-Entitätstyps. Wählen Sie Ausschneiden aus.

  8. Klicken Sie mit der rechten Maustaste auf Skalareigenschaften des Instructor-Entitätstyps, und wählen Sie Einfügen aus.

  9. Klicken Sie mit der rechten Maustaste auf die HireDate-Eigenschaft, und wählen Sie Eigenschaften aus.

  10. Legen Sie im Fenster Eigenschaften die Eigenschaft NULL-Werte zulassen auf false fest.

  11. Wiederholen Sie die Schritte 7 bis 10, schneiden Sie jedoch die EnrollmentDate-Eigenschaft des Person-Entitätstyps aus, und fügen Sie diese in den Student-Entitätstyp ein.

  12. Wählen Sie den Person-Entitätstyp aus. Legen Sie im Fenster Eigenschaften seine Abstrakt-Eigenschaft auf true fest.

    Ein Meldungsfeld wird mit dem Hinweis angezeigt, dass alle vorhandenen Funktionsmappings für einen Entitätstyp entfernt werden, wenn dieser als abstrakt definiert ist. Klicken Sie auf OK.

    NoteHinweis

    Sie müssen im Allgemeinen keine abstrakten Typen zum Modellieren von "Tabelle pro Hierarchie"-Szenarien verwenden. In diesem Beispiel werden abstrakte Typen verwendet, um ihre Verwendung in einem EDM zu veranschaulichen.

    NoteHinweis

    Für die verbleibenden Schritte in diesem Verfahren wird das Fenster Mappingdetails benötigt. Wenn dieses Fenster nicht angezeigt wird, klicken Sie mit der rechten Maustaste auf die Entwurfsoberfläche und wählen Mappingdetails aus.

  13. Wählen Sie den Instructor-Entitätstyp aus, und klicken Sie im Fenster Mappingdetails auf <Eine Tabelle oder Sicht hinzufügen>.

    Das Feld <Eine Tabelle oder Sicht hinzufügen> wird zu einer Dropdownliste von Tabellen oder Sichten, denen die ausgewählte Entität zugeordnet werden kann.

  14. Wählen Sie in der Dropdownliste den Eintrag Person aus.

    Das Fenster Mappingdetails wird durch Standardspaltenmappings und eine Option zum Hinzufügen einer Bedingung aktualisiert.

  15. Klicken Sie auf <Bedingung hinzufügen>.

    Das Feld <Bedingung hinzufügen> wird zu einer Dropdownliste von Spalten, für die Bedingungen festgelegt werden können.

  16. Wählen Sie in der Dropdownliste den Eintrag HireDate aus.

    Ein weiteres Feld <Bedingung hinzufügen> wird angezeigt.

  17. Wählen Sie im Fenster Mappingdetails in der Spalte Operator in der Dropdownliste den Eintrag Ist aus.

  18. Wählen Sie in der Spalte Eigenschaft/Wert den Eintrag Nicht Null aus.

  19. Klicken Sie auf <Bedingung hinzufügen>.

  20. Wählen Sie in der Dropdownliste den Eintrag EnrollmentDate aus.

  21. Wählen Sie in der Spalte Operator in der Dropdownliste den Eintrag Ist aus.

  22. Wählen Sie in der Spalte Eigenschaft/Wert den Eintrag Null aus.

    NoteHinweis

    Wenn ein Wert bzw. eine Eigenschaft in einer Bedingung verwendet wird, kann er bzw. sie nicht auch eine Entitätseigenschaft sein, es sei denn, in der Bedingung wird ein Ist Null-Vergleich oder ein Ist nicht Null-Vergleich verwendet.

  23. Wiederholen Sie die Schritte 13 bis 22 für den Student-Entitätstyp, verwenden Sie jedoch die Bedingungen HireDate Is Null und EnrollmentDate Is Not Null.

Die "Tabelle pro Hierarchie"-Vererbung ist jetzt implementiert.

Erstellen der Benutzeroberfläche

Fügen Sie nun dem CourseViewer-Formular eine Schaltfläche hinzu, mit der das Enrollment-Formular geladen und angezeigt werden kann. Dann fügen Sie dem Enrollment-Formular zwei ComboBox-Steuerelemente und ein ListBox-Steuerelement hinzu. Mit der ersten ComboBox können Sie eine Abteilung auswählen. Mit der zweiten ComboBox können Sie auf der Basis der in der ersten ComboBox ausgewählten Abteilung einen Kurs auswählen. Eine Liste von Teilnehmern und Kursleitern für den ausgewählten Kurs wird im ListBox-Steuerelement angezeigt.

So erstellen Sie die Benutzeroberfläche

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das CourseManager-Projekt, zeigen Sie auf Hinzufügen, und wählen Sie die Option Neues Element aus.

    Das Dialogfeld Neues Element hinzufügen wird angezeigt.

  2. Wählen Sie Windows Form aus, geben Sie dem Formular den Namen Enrollment.vb oder Enrollment.cs (je nachdem, welche Programmiersprache Sie verwenden), und klicken Sie auf Hinzufügen.

    Dem Projekt wird ein neues Formular hinzugefügt, das im Formular-Designer geöffnet wird. Der Name des Formulars wird auf Enrollment festgelegt, und der Text wird auf Enrollment festgelegt.

  3. Ziehen Sie ein ComboBox-Steuerelement von der Toolbox auf das Formular, und legen Sie im Fenster Eigenschaften seinen Namen auf departmentList fest.

  4. Ziehen Sie ein weiteres ComboBox-Steuerelement auf das Formular, und legen Sie seinen Namen auf courseList fest.

  5. Ziehen Sie ein Listbox-Steuerelement von der Toolbox auf das Formular. Legen Sie im Fenster Eigenschaften den Namen des Listenfelds auf studentList fest.

  6. Doppelklicken Sie im Projektmappen-Explorer auf CourseViewer.cs oder CourseViewer.vb.

    Es wird die Entwurfsansicht des CourseViewer-Formulars angezeigt.

  7. Ziehen Sie ein Button-Steuerelement von der Toolbox auf das Formular CourseViewer.

  8. Legen Sie im Fenster Eigenschaften den Namen der Schaltfläche auf viewEnrollment und den Text der Schaltfläche auf View Enrollment fest.

  9. Doppelklicken Sie auf die viewEnrollment-Schaltfläche.

    Die CodeBehind-Datei für das CourseViewer-Formular wird geöffnet.

  10. Fügen Sie dem viewEnrollment_click-Ereignishandler folgenden Code hinzu:

    Dim enrollmentForm As New Enrollment()
    enrollmentForm.Visible = True
    
    Enrollment enrollmentForm = new Enrollment();
    enrollmentForm.Visible = true;
    

Die Benutzeroberfläche ist jetzt fertig gestellt.

Abfragen des EDM

In diesem Verfahren fragen Sie das EDM ab und binden die Ergebnisse an Windows Forms-Steuerelemente. Weitere Informationen über das Binden von Objekten an Steuerelemente finden Sie unter Binden von Objekten an Steuerelemente (Entity Framework).

So können Sie das EDM abfragen

  1. Doppelklicken Sie auf das Enrollment-Formular, während das Enrollment-Formular im Formular-Designer angezeigt wird.

    Die CodeBehind-Datei für das Enrollment-Formular wird geöffnet.

  2. Fügen Sie die folgende using-Anweisung (C#) bzw. Imports-Anweisung (Visual Basic) hinzu, um auf den EDM-Namespace zu verweisen.

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. Fügen Sie der Enrollment-Klasse eine Eigenschaft hinzu, die den Datenkontext darstellt:

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. Fügen Sie dem Enrollment_Load-Ereignishandler Code zur Initialisierung des Objektkontexts hinzu, und binden Sie das ComboBox-Steuerelement an eine Abfrage, die alle Abteilungen und die verknüpften Kursinformationen zurückgibt.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Define a query that returns all Department objects and 
    ' related Course objects, ordered by name.
    Dim departmentQuery As ObjectQuery(Of Department) = _
        schoolContext.Department.Include("Course") _
        .OrderBy("it.Name")
    
    ' Bind the ComboBox control to the query, which is 
    ' executed during data binding.
    Me.departmentList.DataSource = departmentQuery _
    .Execute(MergeOption.OverwriteChanges)
    Me.departmentList.DisplayMember = "Name"
    
        // Initialize the ObjectContext.
        schoolContext = new SchoolEntities();
    
        // Define a query that returns all Department objects
        // and related Course objects, ordered by name.
        ObjectQuery<Department> departmentQuery =
            schoolContext.Department.Include("Course")
                                    .OrderBy("it.Name");
    
        // Bind the ComboBox control to the query, which is
        // executed during data binding.
        this.departmentList.DataSource = departmentQuery
    .Execute(MergeOption.OverwriteChanges);
        this.departmentList.DisplayMember = "Name";
    
  5. Kehren Sie zur Entwurfsansicht des Enrollment-Formulars zurück, und doppelklicken Sie auf das ComboBox-Steuerelement departmentList.

    Der departmentList_SelectedIndexChanged-Ereignishandler wird in der CodeBehind-Datei erstellt.

  6. Fügen Sie dem Ereignishandler Code hinzu, um das ComboBox-Steuerelement courseList an die Course-Eigenschaften der ausgewählten Department zu binden.

    ' Get the object for the selected department
    Dim department As Department = CType(Me.departmentList _
            .SelectedItem, Department)
    
    ' Bind the ComboBox control Course properties of
    ' the selected Department.
    courseList.DataSource = department.Course
    courseList.DisplayMember = "Title"
    
    // Get the object for the selected department.
    Department department =
            (Department)this.departmentList.SelectedItem;
    
    // Bind the ComboBox control Course properties of 
    // the selected Department.
    courseList.DataSource = department.Course;
    courseList.DisplayMember = "Title";
    
  7. Kehren Sie zur Entwurfsansicht des Enrollment-Formulars zurück, und doppelklicken Sie auf das ComboBox-Steuerelement courseList.

    Der courseList_SelectedIndexChanged-Ereignishandler wird in der CodeBehind-Datei erstellt.

  8. Fügen Sie dem Ereignishandler Code hinzu, um in der ListBox eine Liste von Teilnehmern anzuzeigen.

    Me.studentList.Items.Clear()
    
    ' Get the CourseID from the selected Course.
    Dim course As Course = CType(Me.courseList.SelectedItem,  _
         Course)
    Dim courseId As Integer = course.CourseID
    
    ' Get all CourseGrade objects for the supplied CourseID
    Dim studentQuery As Course = schoolContext.Course.Where _
         ("it.CourseID = @courseID", New ObjectParameter _
          ("courseID", courseId)).Include("CourseGrade"). _
          FirstOrDefault()
    
    ' Get all students for each CourseGrade
    For Each cg As CourseGrade In studentQuery.CourseGrade
        cg.PersonReference.Load()
        studentList.Items.Add(cg.Person.LastName + ", " + _
                            cg.Person.FirstName)
    Next
    
    studentList.Items.Add(" ")
    
    ' Get all Instructor types for the supplied CourseID
    Dim instructorQuery As Course = schoolContext.Course. _
         Where("it.CourseID = @courseID", New ObjectParameter _
               ("courseID", courseId)).Include("Person") _
               .FirstOrDefault()
    
    ' Display each instructor for the specified Course
    For Each Instructor As Instructor In instructorQuery.Person
        Me.studentList.Items.Add("Instructor: " + Instructor. _
                        LastName + ", " + Instructor.FirstName)
    Next
    
    studentList.Items.Clear();
    
    // Get the CourseID from the selected Course.
    Course course = (Course)courseList.SelectedItem;
    int courseId = course.CourseID;
    
    // Get all CourseGrade types for the supplied CourseID
    Course studentQuery = schoolContext.Course.Where(
        "it.CourseID = @courseID", new ObjectParameter
            ("courseID", courseId)).Include("CourseGrade").
            FirstOrDefault();
    
    // Get all students for each CourseGrade
    foreach (CourseGrade cg in studentQuery.CourseGrade)
    {
        cg.PersonReference.Load();
        studentList.Items.Add(cg.Person.LastName + ", " +
            cg.Person.FirstName);
    }
    
    studentList.Items.Add(" ");
    
    // Get all Instructor types for the supplied CourseID
    Course instructorQuery = schoolContext.Course.Where(
        "it.CourseID = @courseID", new ObjectParameter
            ("courseID", courseId)).Include("Person").
            FirstOrDefault();
    
    // Display each instructor for the specified course.
    foreach (Instructor instructor in instructorQuery.Person.
        OfType<Instructor>())
    {
        studentList.Items.Add("Instructor: " + instructor.
            LastName + ", " + instructor.FirstName);
    }
    

Die Anwendung ist jetzt fertig gestellt. Drücken Sie STRG+F5, um die Anwendung auszuführen. Klicken Sie auf die Schaltfläche View Enrollment, um das Enrollment-Formular zu laden. Im ListBox werden Kursregistrierungen und Kursleiter für den ausgewählten Kurs angezeigt.

Codelisting

In diesem Abschnitt wird die endgültige Version der CodeBehind-Datei für das Enrollment-Formular aufgeführt.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses

Public Class Enrollment

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub Enrollment_Load(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Define a query that returns all Department objects and 
        ' related Course objects, ordered by name.
        Dim departmentQuery As ObjectQuery(Of Department) = _
            schoolContext.Department.Include("Course") _
            .OrderBy("it.Name")

        ' Bind the ComboBox control to the query, which is 
        ' executed during data binding.
        Me.departmentList.DataSource = departmentQuery _
        .Execute(MergeOption.OverwriteChanges)
        Me.departmentList.DisplayMember = "Name"
    End Sub

    Private Sub departmentList_SelectedIndexChanged(ByVal sender _
            As System.Object, ByVal e As System.EventArgs) Handles _
            departmentList.SelectedIndexChanged
        ' Get the object for the selected department
        Dim department As Department = CType(Me.departmentList _
                .SelectedItem, Department)

        ' Bind the ComboBox control Course properties of
        ' the selected Department.
        courseList.DataSource = department.Course
        courseList.DisplayMember = "Title"
    End Sub

    Private Sub courseList_SelectedIndexChanged(ByVal sender As  _
            System.Object, ByVal e As System.EventArgs) Handles _
            courseList.SelectedIndexChanged
        Me.studentList.Items.Clear()

        ' Get the CourseID from the selected Course.
        Dim course As Course = CType(Me.courseList.SelectedItem,  _
             Course)
        Dim courseId As Integer = course.CourseID

        ' Get all CourseGrade objects for the supplied CourseID
        Dim studentQuery As Course = schoolContext.Course.Where _
             ("it.CourseID = @courseID", New ObjectParameter _
              ("courseID", courseId)).Include("CourseGrade"). _
              FirstOrDefault()

        ' Get all students for each CourseGrade
        For Each cg As CourseGrade In studentQuery.CourseGrade
            cg.PersonReference.Load()
            studentList.Items.Add(cg.Person.LastName + ", " + _
                                cg.Person.FirstName)
        Next

        studentList.Items.Add(" ")

        ' Get all Instructor types for the supplied CourseID
        Dim instructorQuery As Course = schoolContext.Course. _
             Where("it.CourseID = @courseID", New ObjectParameter _
                   ("courseID", courseId)).Include("Person") _
                   .FirstOrDefault()

        ' Display each instructor for the specified Course
        For Each Instructor As Instructor In instructorQuery.Person
            Me.studentList.Items.Add("Instructor: " + Instructor. _
                            LastName + ", " + Instructor.FirstName)
        Next
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class Enrollment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public Enrollment()
        {
            InitializeComponent();
        }

        private void Enrollment_Load(object sender, EventArgs e)
        {
            // Initialize the ObjectContext.
            schoolContext = new SchoolEntities();

            // Define a query that returns all Department objects
            // and related Course objects, ordered by name.
            ObjectQuery<Department> departmentQuery =
                schoolContext.Department.Include("Course")
                                        .OrderBy("it.Name");

            // Bind the ComboBox control to the query, which is
            // executed during data binding.
            this.departmentList.DataSource = departmentQuery
        .Execute(MergeOption.OverwriteChanges);
            this.departmentList.DisplayMember = "Name";
        }

        private void departmentList_SelectedIndexChanged(object sender, 
            EventArgs e)
        {
            // Get the object for the selected department.
            Department department =
                    (Department)this.departmentList.SelectedItem;

            // Bind the ComboBox control Course properties of 
            // the selected Department.
            courseList.DataSource = department.Course;
            courseList.DisplayMember = "Title";
        }

        private void courseList_SelectedIndexChanged(object sender, 
            EventArgs e)
        {
            studentList.Items.Clear();

            // Get the CourseID from the selected Course.
            Course course = (Course)courseList.SelectedItem;
            int courseId = course.CourseID;

            // Get all CourseGrade types for the supplied CourseID
            Course studentQuery = schoolContext.Course.Where(
                "it.CourseID = @courseID", new ObjectParameter
                    ("courseID", courseId)).Include("CourseGrade").
                    FirstOrDefault();

            // Get all students for each CourseGrade
            foreach (CourseGrade cg in studentQuery.CourseGrade)
            {
                cg.PersonReference.Load();
                studentList.Items.Add(cg.Person.LastName + ", " +
                    cg.Person.FirstName);
            }

            studentList.Items.Add(" ");

            // Get all Instructor types for the supplied CourseID
            Course instructorQuery = schoolContext.Course.Where(
                "it.CourseID = @courseID", new ObjectParameter
                    ("courseID", courseId)).Include("Person").
                    FirstOrDefault();

            // Display each instructor for the specified course.
            foreach (Instructor instructor in instructorQuery.Person.
                OfType<Instructor>())
            {
                studentList.Items.Add("Instructor: " + instructor.
                    LastName + ", " + instructor.FirstName);
            }
        } 
    }
}

Nächste Schritte

Sie haben die "Tabelle pro Hierarchie"-Vererbung erfolgreich in einem EDM implementiert. Weitere Informationen zum Definieren eines EDM mit "Tabelle pro Hierarchie"-Vererbung finden Sie unter Gewusst wie: Definieren eines Modells mit 'Tabelle pro Hierarchie'-Vererbung (Entity Framework). Weitere Informationen zum Erstellen von Anwendungen mit Entity Framework finden Sie unter Programmierhandbuch (Entity Framework).

Siehe auch

Weitere Ressourcen

Szenarios für den ADO.NET Entity Data Model-Designer
Aufgaben der Entity Data Model-Tools