Exemplarische Vorgehensweise: Zuordnen einer Entität zu mehreren Tabellen (Entity Data Model-Tools)
In diesem Thema wird gezeigt, wie ein Entitätstyp zwei Tabellen zugeordnet wird, indem ein konzeptionelles Modell 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 die Zuordnung zu mehr als zwei Tabellen erweitern.
In dieser exemplarischen Vorgehensweise ordnen Sie einen Entitätstyp zwei Tabellen zu, indem Sie das in der Anwendung "CourseManager" (weitere Informationen finden Sie im Abschnitt "Erforderliche Komponenten" weiter unten in diesem Thema) verwendete konzeptionelle Modell ä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):
Erstellen Sie den neuen Entitätstyp Instructor.
Wählen Sie Person als Basistyp für Instructor aus.
Hinweis: 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. Verschieben Sie die Eigenschaft HireDate von Person zu Instructor.
Verschieben Sie die Eigenschaften Location und Timestamp von OfficeAssignment zu Instructor.
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.
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.
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 konzeptionelle Modell, indem Sie einen neuen Entitätstyp hinzufügen und ihn zwei Tabellen zuordnen. Anschließend erweitern Sie die Funktionalität der Anwendung dahingehend, dass die Dienstaufgaben der Lehrkräfte angezeigt werden.
Hinweis: |
---|
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.
Zuordnung einer Entität zu zwei Tabellen
In diesem Verfahren ändern Sie den CSDL- und Zuordnungsinhalt der Datei School.edmx, indem Sie einen neuen Entitätstyp (Instructor) erstellen und ihn zwei Tabellen (Person und OfficeAssignment) zuordnen.
So ordnen Sie eine Entität zwei Tabellen zu
Öffnen Sie in Visual Studio die Projektmappe CourseManager.
Doppelklicken Sie im Projektmappen-Explorer auf die Datei School.edmx.
Die Datei School.edmx wird im EDM-Designer (Entity Designer) geöffnet.
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.
Geben Sie Instructor als Entitätsnamen ein, und wählen Sie in der Dropdownliste Person als Basistyp aus.
Klicken Sie auf OK.
Ein neuer Entitätstyp wird erstellt und auf der Entwurfsoberfläche angezeigt.
Klicken Sie mit der rechten Maustaste auf die HireDate-Eigenschaft (unter Skalareigenschaften) des Person-Entitätstyps, und wählen Sie Ausschneiden aus.
Klicken Sie mit der rechten Maustaste auf Skalareigenschaften des Instructor-Entitätstyps, und wählen Sie Einfügen aus.
Klicken Sie mit der rechten Maustaste auf die HireDate-Eigenschaft, und wählen Sie Eigenschaften aus.
Das Fenster Eigenschaften wird angezeigt.
Legen Sie im Fenster Eigenschaften die Eigenschaft NULL-Werte zulassen auf false fest.
Klicken Sie mit der rechten Maustaste auf die Location-Eigenschaft des OfficeAssignment-Entitätstyps, und wählen Sie Ausschneiden aus.
Klicken Sie mit der rechten Maustaste auf Skalareigenschaften des Instructor-Entitätstyps, und wählen Sie Einfügen aus.
Klicken Sie mit der rechten Maustaste auf die Location-Eigenschaft, und wählen Sie Eigenschaften aus.
Setzen Sie im Fenster Eigenschaften die Eigenschaft NULL-Werte zulassen auf false.
Wiederholen Sie die Schritte 10 bis 13 für die Timestamp-Eigenschaft des OfficeAssignment-Typs.
Hinweis: 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. 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.
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.
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.
Wählen Sie in der Dropdownliste den Eintrag HireDate aus.
In der Spalte Operator des Fensters Mappingdetails wählen Sie Ist in der Dropdownliste aus.
Wählen Sie in der Spalte Eigenschaft/Wert des Fensters Mappingdetails die Option Nicht Null aus.
Klicken Sie auf <Tabelle oder Sicht hinzufügen>, und wählen Sie in der Dropdownliste OfficeAssignment aus.
Das Fenster Mappingdetails wird mit Standardspaltenzuordnungen aktualisiert.
Klicken Sie auf das Feld Eigenschaft/Wert das der Spalte InstructorID entspricht, und wählen Sie in der Dropdownliste PersonID aus.
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
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.
Wählen Sie Windows Form aus, legen Sie den Namen des Formulars auf OfficeAssignment.vb oder OfficeAssignment.cs fest, 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.
Ziehen Sie ein DataGridView-Steuerelement auf das Formular, und legen Sie dessen Namen auf officeGridView fest.
Klicken Sie auf das Smarttag des DataGridView, und deaktivieren Sie die Optionen Hinzufügen aktivieren und Löschen aktivieren.
Ziehen Sie ein Button-Steuerelement in das Formular, und legen Sie die "Name"-Eigenschaft auf saveChanges und die Text-Eigenschaft auf Update fest.
Doppelklicken Sie im Projektmappen-Explorer auf CourseViewer.cs oder CourseViewer.vb.
Die Entwurfsansicht des CourseViewer-Formulars wird angezeigt.
Ziehen Sie ein Button-Steuerelement von der Toolbox in das Formular CourseViewer.
Legen Sie im Fenster Eigenschaften den Namen der Schaltfläche auf viewOffices und den Text der Schaltfläche auf View Offices fest.
Doppelklicken Sie auf viewOffices Button.
Die CodeBehind-Datei für den CourseViewer wird geöffnet.
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 konzeptionellen Modells
Diese Anwendung zeigt Daten an, indem ein DataGridView-Steuerelement an eine Abfrage gebunden wird. Die im DataGridView-Steuerelement angezeigten Informationen können geändert und in der Datenbank gespeichert werden. Weitere Informationen über das Binden von Objekten an Steuerelemente finden Sie unter Binding Objects to Controls (Entity Framework).
So fragen Sie das konzeptionelle Modell ab
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.
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;
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;
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.People.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 officeGridView.Columns("StudentGrades").Visible = False officeGridView.Columns("Courses").Visible = False
schoolContext = new SchoolEntities(); // Get Persons of type Instructor. ObjectQuery<Instructor> instructorQuery = schoolContext .People.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; officeGridView.Columns["StudentGrades"].Visible = false; officeGridView.Columns["Courses"].Visible = false;
Kehren Sie zur Entwurfsansicht des OfficeAssignment-Formulars zurück, und doppelklicken Sie auf das saveChanges Button-Steuerelement.
Der saveChanges_Click-Ereignishandler wird in der CodeBehind-Datei erstellt.
Fügen Sie dem Ereignishandler Code hinzu, um alle Änderungen, die im DataGridView-Steuerelement durchgeführt wurden, in der Datenbank zu speichern.
' Save object changes to the database, ' display a message, and refresh the form. schoolContext.SaveChanges() MessageBox.Show("Change(s) saved to the database.") Me.Refresh()
// Save object changes to the database, // display a message, and refresh the form. schoolContext.SaveChanges(); MessageBox.Show("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.People.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
officeGridView.Columns("StudentGrades").Visible = False
officeGridView.Columns("Courses").Visible = False
End Sub
Private Sub saveChanges_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles saveChanges.Click
' Save object changes to the database,
' display a message, and refresh the form.
schoolContext.SaveChanges()
MessageBox.Show("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
.People.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;
officeGridView.Columns["StudentGrades"].Visible = false;
officeGridView.Columns["Courses"].Visible = false;
}
private void saveChanges_Click(object sender, EventArgs e)
{
// Save object changes to the database,
// display a message, and refresh the form.
schoolContext.SaveChanges();
MessageBox.Show("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 How to: Define a Model with a Single Entity Mapped to Two Tables. Weitere Informationen zum Erstellen von Anwendungen, die Entity Framework verwenden, finden Sie unter ADO.NET Entity Framework.
Siehe auch
Weitere Ressourcen
Szenarien für die Verwendung der Entity Data Model-Tools
Aufgaben der Entity Data Model-Tools