Freigeben über


Exemplarische Vorgehensweise: Mapping einer Entität zu mehreren Tabellen

In diesem Thema wird dargestellt, wie ein Entitätstyp zwei Tabellen zugeordnet wird, indem das konzeptionelle Modell eines Entity Data Model (EDM) geändert wird. Sie können eine Entität mehreren Tabellen zuordnen, sofern für die Tabellen ein gemeinsamer Schlüssel vorhanden ist. Die Prinzipien, nach denen ein Entitätstyp zwei Tabellen zugeordnet wird, lassen sich leicht auf das Mapping zu mehr als zwei Tabellen erweitern. Weitere Informationen über das Mapping einer Entität zu mehreren Tabellen finden Sie unter Gewusst wie: Definieren eines Modells mit einer einzelnen Entität, der zwei Tabellen zugeordnet werden.

In dieser exemplarischen Vorgehensweise ordnen Sie einen Entitätstyp zwei Tabellen zu, 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. Sie erstellen einen neuen Entitätstyp (Instructor, abgeleitet vom Person -Entitätstyp) und ordnen diesen den Tabellen Person und OfficeAssignment zu. Die folgenden Schritte fassen die Vorgehensweise zusammen (weiter unten in diesem Dokument wird das Verfahren genauer beschrieben):

  1. Erstellen Sie den neuen Entitätstyp Instructor.

  2. Wählen Sie Person als Basistyp für Instructor aus.

    NoteHinweis

    Um einen Entitätstyp mehreren Tabellen zuzuordnen ist es nicht erforderlich, eine Vererbungshierarchie zu erstellen. Für dieses Beispiel wird eine Vererbungshierarchie erstellt, um es realistischer wirken zu lassen (in einer Schule hätte nur der Lehrer Dienstaufgaben). Es wäre möglich, den Entitätstyp Person sowohl der Tabelle Person als auch der Tabelle OfficeAssignment zuzuordnen, ohne einen Entitätstyp Instructor zu erstellen.

  3. Verschieben Sie die Eigenschaft HireDate von Person auf Instructor.

  4. Verschieben Sie die Eigenschaft Location von OfficeAssignment auf Instructor.

  5. Ordnen Sie die Instructor-Entität der Tabelle Person mit der Bedingung HireDate Is Not Null zu. Ordnen Sie der HireDate-Eigenschaft die Spalte HireDate zu.

  6. Ordnen Sie die Instructor-Entität ohne Bedingung der Tabelle OfficeAssignment zu. Ordnen Sie die Spalte InstructorID der PersonID-Eigenschaft und die Spalte Location der Location-Eigenschaft zu.

  7. Löschen Sie den OfficeAssignment-Entitätstyp.

Erforderliche Komponenten

Um dieses exemplarische Vorgehen durchzuführen, muss zunächst die Anwendung CourseManager erstellt werden. Weitere Informationen finden Sie unter Entity Framework-Schnellstart. Sie ändern das in der Anwendung CourseManager verwendete EDM, indem Sie einen neuen Entitätstyp hinzufügen und diesen zwei Tabellen zuordnen. Anschließend erweitern Sie die Funktionalität der Anwendung dahingehend, dass die Dienstaufgaben der Lehrkräfte angezeigt werden.

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, statt 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 entweder Visual C#- oder Visual Basic-Programmierung verfügen.

Mapping einer Entität zu zwei Tabellen

In diesem Vorgang ändern Sie den konzeptuellen Teil des EDM "SchoolModel", indem Sie einen neuen Entitätstyp (Instructor) erstellen und diesen zwei Tabellen (Person und OfficeAssignment) zuordnen.

So ordnen Sie eine Entität zwei Tabellen zu

  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 EDM-Designer (Entity Designer) geöffnet.

  3. Klicken Sie mit der rechten Maustaste auf einen leere Stelle 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.

    Ein neuer Entitätstyp wird erstellt und auf der Entwurfsoberfläche angezeigt.

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

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

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

    Das Fenster Eigenschaften wird angezeigt.

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

  10. Klicken Sie mit der rechten Maustaste auf die Location-Eigenschaft des OfficeAssignment-Entitätstyps, und wählen Sie Ausschneiden aus.

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

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

  13. Setzen Sie im Fenster Eigenschaften die Eigenschaft NULL-Werte zulassen auf false.

  14. Wiederholen Sie die Schritte 10 bis 13 für die Timestamp-Eigenschaft des OfficeAssignment-Typs.

    NoteHinweis

    Für die nächsten Schritte wird das Fenster Mappingdetails verwendet. Wenn dieses Fenster ausgeblendet ist, klicken Sie mit der rechten Maustaste auf die Entwurfsoberfläche und wählen Mappingdetails aus.

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

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

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

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

  17. 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.

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

  19. In der Spalte Operator des Fensters Mappingdetails wählen Sie Ist in der Dropdownliste aus.

  20. Wählen Sie in der Spalte Eigenschaft/Wert des Fensters Mappingdetails die Option Nicht Null aus.

  21. Klicken Sie auf <Tabelle oder Sicht hinzufügen>, und wählen Sie in der Dropdownliste OfficeAssignment aus.

    Das Fenster Mappingdetails wird mit Standardspaltenzuordnungen aktualisiert.

  22. Klicken Sie auf das Feld Eigenschaft/Wert das der Spalte InstructorID entspricht, und wählen Sie in der Dropdownliste PersonID aus.

  23. Klicken Sie mit der rechten Maustaste auf den Entitätstyp OfficeAssignment, und wählen Sie Löschen aus.

Der Instructor-Entitätstyp ist damit den Tabellen Person und OfficeAssignment zugeordnet.

Erstellen der Benutzeroberfläche

Als Nächstes fügen Sie dem CourseViewer-Formular eine Schaltfläche hinzu, mit der das CourseAssignmentForm-Formular geladen und angezeigt wird. Anschließend fügen Sie dem Formular ein DataGridView-Steuerelement hinzu, um die Instructor-Bürostandorte anzuzeigen. Schließlich fügen Sie dem CourseAssignmentForm eine Schaltfläche hinzu, mit der die Aktualisierungen in der Datenbank gespeichert werden.

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 den Eintrag Windows Form aus, setzten Sie den Namen des Formulars auf OfficeAssignment.vb oder OfficeAssignment.cs, und klicken Sie auf Hinzufügen.

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

  3. Ziehen Sie ein DataGridView-Steuerelement auf das Formular, und legen Sie dessen Namen auf officeGridView fest.

  4. Klicken Sie auf das Smarttag des DataGridView, und deaktivieren Sie die Optionen Hinzufügen aktivieren und Löschen aktivieren.

  5. Ziehen Sie ein Button-Steuerelement in das Formular, und legen Sie die "Name"-Eigenschaft auf saveChanges und die Text-Eigenschaft auf Update fest.

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

    Die Entwurfsansicht des CourseViewer-Formulars wird angezeigt.

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

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

  9. Doppelklicken Sie auf viewOfficesButton.

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

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

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

Die Benutzeroberfläche für dieses Formular ist damit vollständig.

Abfragen des EDM

In dieser Anwendung werden Daten angezeigt, indem ein DataGridView-Steuerelement an das EDM "SchoolModel" gebunden wird. Die im Steuerelement DataGridView angezeigten Informationen können geändert und in der Datenbank gespeichert werden. Weitere Informationen über das Binden von Objekten an Steuerelemente finden Sie unter Binden von Objekten an Steuerelemente (Entity Framework).

So fragen Sie das EDM ab

  1. Doppelklicken Sie, während das OfficeAssignment-Formular im Formular-Designer geöffnet ist, auf den Hauptteil des Formulars.

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

  2. Fügen Sie folgende using-Anweisung (C#) oder Imports-Anweisung (Visual Basic) hinzu, um auf das aus der Datenbank "School" erstellte Modell und den Entity 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 eine Eigenschaft hinzu, die den Datenkontext zur OfficeAssignment-Klasse 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 OfficeAssignment_Load-Ereignishandler Code zur Initialisierung des Objektkontexts hinzu, und binden Sie das DataGridView-Steuerelement an eine Abfrage, die Instructor-Informationen zurückgibt.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.Person.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .Person.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    
  5. Kehren Sie zur Entwurfsansicht des OfficeAssignment-Formulars zurück, und doppelklicken Sie auf das saveChangesButton-Steuerelement.

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

  6. Fügen Sie dem Ereignishandler Code hinzu, um alle Änderungen, die im DataGridView-Steuerelement durchgeführt wurden, in der Datenbank zu speichern.

    Dim numChanges As Integer
    
    ' Save object changes to the database, display a message,
    ' and refresh the form.
    numChanges = schoolContext.SaveChanges()
    MessageBox.Show(numChanges.ToString() + _
                    " change(s) saved to the database.")
    Me.Refresh()
    
    int numChanges;
    // Save object changes to the database, display a message,
    // and refresh the form.
    numChanges = schoolContext.SaveChanges();
    MessageBox.Show(numChanges.ToString() +
        " change(s) saved to the database.");
    this.Refresh();
    

Die Anwendung ist damit fertig gestellt. Drücken Sie STRG+F5, um die Anwendung auszuführen. Klicken Sie auf die Schaltfläche View Offices, um das OfficeAssignments-Formular zu laden. Namen der Lehrkräfte und Bürostandorte werden angezeigt. Sie können die angezeigten Informationen ändern und in der Datenbank speichern, indem Sie auf die Schaltfläche Update klicken.

Codelisting

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

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

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

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.Person.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saveChanges.Click
        Dim numChanges As Integer

        ' Save object changes to the database, display a message,
        ' and refresh the form.
        numChanges = schoolContext.SaveChanges()
        MessageBox.Show(numChanges.ToString() + _
                        " change(s) saved to the database.")
        Me.Refresh()
    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 OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .Person.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            int numChanges;
            // Save object changes to the database, display a message,
            // and refresh the form.
            numChanges = schoolContext.SaveChanges();
            MessageBox.Show(numChanges.ToString() +
                " change(s) saved to the database.");
            this.Refresh();
        }
    }
}

Nächste Schritte

Sie haben eine Entität erfolgreich mehreren Tabellen zugeordnet. Weitere Informationen über das Erstellen eines Modells mit einer Entität, die mehreren Tabellen zugeordnet ist, finden Sie unter Gewusst wie: Definieren eines Modells mit einer einzelnen Entität, der zwei Tabellen zugeordnet werden. Weitere Informationen zum Erstellen von Anwendungen, die Entity Framework verwenden, 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