Exemplarische Vorgehensweise: Abrufen von Entitätstypen mit einer gespeicherten Prozedur (Entity Data Model-Tools)
In diesem Thema wird beschrieben, wie mithilfe einer gespeicherten Prozedur eine Auflistung von Entitätstypen abgerufen wird. In dieser exemplarischen Vorgehensweise verwenden Sie den ADO.NET Entity Data Model Designer (Entity Designer), um eine gespeicherte Prozedur zu importieren und einen Funktionsimport zu erstellen, der eine Auflistung von Entitätstypen zurückgibt.
Durch das Hinzufügen einer gespeicherten Prozedur im konzeptionellen Modell können Sie gespeicherte Prozeduren vom Anwendungscode aus aufrufen. Eine dem konzeptionellen Modell hinzugefügte gespeicherte Prozedur wird als Funktionsimport bezeichnet. Ein Funktionsimport kann Auflistungen von einfachen Typen, komplexen Typen und Entitätstypen oder keinen Wert zurückgeben.
Hinweis: |
---|
Damit ein Funktionsimport einen EntityType zurückgibt, müssen die von der entsprechenden gespeicherten Prozedur zurückgegebenen Spalten genau mit den skalaren Eigenschaften des zurückgegebenen EntityType übereinstimmen. |
Wenn der Assistent für Entity Data Model eine EDMX-Datei aus einer Datenbank generiert, werden für jede gespeicherte Prozedur in der Datenbank Einträge im Speichermodell erstellt. Dem konzeptionellen Modell werden beim Erstellen eines Funktionsimports entsprechende Einträge hinzugefügt. Weitere Informationen zum Erstellen eines Funktionsimports finden Sie unter Gewusst wie: Importieren einer gespeicherten Prozedur (Entity Data Model-Tools).
Erforderliche Komponenten
Zum Durchführen dieser exemplarischen Vorgehensweise 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 ihr konzeptionelles Modell, indem Sie auf Grundlage der gespeicherten Prozedur GetStudentGrades einen Funktionsimport erstellen.
Hinweis: |
---|
Da die Anwendung "CourseManager" für viele der exemplarischen Vorgehensweisen in dieser Dokumentation als Ausgangspunkt dient, wird empfohlen, für diese exemplarische Vorgehensweise eine Kopie der Anwendung "CourseManager" zu verwenden und nicht den Originalcode 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.
Erstellen eines Funktionsimports
In diesem Verfahren erstellen Sie basierend auf der gespeicherten Prozedur GetStudentGrades, die im Speichermodell der Anwendung "CourseManager" enthalten ist, einen Funktionsimport.
So erstellen Sie einen Funktionsimport
Öffnen Sie in Visual Studio die Projektmappe "CourseManager".
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, und das Fenster Modellbrowser wird geöffnet.
Erweitern Sie den EntityContainer: SchoolEntities-Knoten im Fenster Modellbrowser.
Die Ordner Entitätenmengen, Zuordnungssätze und Funktionsimporte werden in der Strukturansicht angezeigt.
Klicken Sie mit der rechten Maustaste auf Funktionsimporte, und wählen Sie Funktionsimport hinzufügen aus.
Das Dialogfeld Add Function Import wird geöffnet.
Wählen Sie GetStudentGrades in der Dropdownliste Name der gespeicherten Prozedur aus.
Geben Sie GetStudentGrades in das Textfeld Name des Funktionsimports ein.
Wählen Sie Entitäten als Rückgabewert aus, und wählen Sie in der entsprechenden Dropdownliste StudentGrade aus.
Hinweis: Der Rückgabetyp kann auf StudentGrade festgelegt werden, da die von der gespeicherten Prozedur GetStudentGrades zurückgegebenen Spalten (EnrollementID, StudentID, CourseID und Grade) genau mit den skalaren Eigenschaften des StudentGrade-Entitätstyps übereinstimmen. Klicken Sie auf OK.
GetStudentGradesFunction Import wird dem konzeptionellen Modell hinzugefügt.
Erstellen der Benutzeroberfläche
In diesem Verfahren fügen Sie der Benutzeroberfläche der Anwendung "CourseManager" ein Formular hinzu, damit die Noten eines ausgewählten Studenten angezeigt werden können.
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 GradeViewer.vb oder GradeViewer.cs fest, und klicken Sie auf Hinzufügen.
Dem Projekt wird ein neues Formular hinzugefügt, und das Formular wird im Formular-Designer geöffnet. Der Name des Formulars wird auf GradeViewer festgelegt, und der Text wird auf GradeViewer festgelegt.
Ziehen Sie ein ComboBox-Steuerelement von der Toolbox zum Formular, und legen Sie den Namen im Fenster Eigenschaften auf studentList fest.
Ziehen Sie ein DataGridView-Steuerelement von der Toolbox zum Formular, und legen Sie den Namen im Fenster Eigenschaften auf gradeGridView fest.
Doppelklicken Sie im Projektmappen-Explorer auf die Datei CourseViewer.vb oder CourseViewer.cs.
Die Datei wird im Formular-Designer geöffnet.
Ziehen Sie ein Button-Steuerelement in das Formular. Legen Sie den Namen auf viewGrades und den Text auf View Grades fest.
Doppelklicken Sie auf das Button-Steuerelement viewGrades.
Der viewGrades_Click-Ereignishandler wird zur CodeBehind-Datei hinzugefügt.
Fügen Sie dem viewGrades_Click-Ereignishandler folgenden Code hinzu:
Dim gradeViewer As New GradeViewer() gradeViewer.Visible = True
GradeViewer gradeViewer = new GradeViewer(); gradeViewer.Visible = true;
Die Benutzeroberfläche ist damit vollständig.
Abrufen von Entitätstypen mit einer gespeicherten Prozedur
In diesem Verfahren fügen Sie Code hinzu, durch den der zuvor aus der gespeicherten Prozedur GetStudentGrades erstellte Funktionsimport ausgeführt wird. Der Code bindet dann die zurückgegebene EntityType-Auflistung an ein DataGridView-Steuerelement. Weitere Informationen über das Binden von Objekten an Steuerelemente finden Sie unter Binding Objects to Controls (Entity Framework).
So rufen Sie Entitätstypen mit einer gespeicherten Prozedur ab
Doppelklicken Sie, während das GradeViewer-Formular im Formular-Designer geöffnet ist, auf den Hauptteil des Formulars.
Die CodeBehind-Datei für das GradeViewer-Formular wird geöffnet.
Fügen Sie die folgenden using (C#)- oder Imports (Visual Basic)-Anweisungen hinzu:
Imports System.Data.Objects Imports System.Data.Objects.DataClasses
using System.Data.Objects; using System.Data.Objects.DataClasses;
Fügen Sie eine Eigenschaft zur GradeViewer-Klasse hinzu, die den Objektkontext 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 im GradeViewer_Load-Ereignishandler den folgenden Code hinzu. Dieser Code initialisiert den Objektkontext und legt die Datenquelle für das ComboBox-Steuerelement auf eine Abfrage fest, die alle Person-Typen zurückgibt, deren EnrollmentDate nicht NULL ist.
' Initialize schoolContext. schoolContext = New SchoolEntities() ' Define the query to retrieve students. Dim studentQuery As ObjectQuery(Of Person) = schoolContext _ .People.Where("it.EnrollmentDate is not null") _ .OrderBy("it.LastName") ' Execute and bind the studentList control to the query. studentList.DataSource = studentQuery _ .Execute(MergeOption.OverwriteChanges) studentList.DisplayMember = "LastName"
schoolContext = new SchoolEntities(); // Define the query to retrieve students. ObjectQuery<Person> studentQuery = schoolContext.People .Where("it.EnrollmentDate is not null") .OrderBy("it.LastName"); // Execute and bind the studentList control to the query. studentList.DataSource = studentQuery .Execute(MergeOption.OverwriteChanges); studentList.DisplayMember = "LastName";
Kehren Sie zur Entwurfsansicht des GradeViewer-Formulars zurück, und doppelklicken Sie auf das studentListComboBox-Steuerelement.
Der studentList_SelectedIndexChanged-Ereignishandler wird zur CodeBehind-Datei hinzugefügt.
Fügen Sie dem studentList_SelectedIndexChanged-Ereignishandler folgenden Code hinzu. Dieser Code führt den Function Import GetStudentGrades aus und bindet die Ergebnisse an das DataGridView-Steuerelement, wenn ein neuer Student aus der Dropdownliste ausgewählt wird.
' Get the selected student so we can use the ' PersonID in the function import call. Dim currentStudent As Person = CType(Me.studentList _ .SelectedItem(), Person) ' Set the data source for the gradeGridView ' to the results returned by the GetStudentGrades ' Function Import. gradeGridView.DataSource = schoolContext _ .GetStudentGrades(currentStudent.PersonID) gradeGridView.Columns("Course").Visible = False gradeGridView.Columns("StudentID").Visible = False gradeGridView.Columns("Person").Visible = False gradeGridView.Columns("EnrollmentID").Visible = False gradeGridView.AllowUserToAddRows = False gradeGridView.AllowUserToDeleteRows = False
// Get the selected student so we can use the // PersonID in the function import call. Person currentStudent = (Person)this.studentList .SelectedItem; // Set the data source for the gradeGridView // to the results returned by the GetStudentGrades // Function Import. gradeGridView.DataSource = schoolContext .GetStudentGrades(currentStudent.PersonID); gradeGridView.Columns["Course"].Visible = false; gradeGridView.Columns["StudentID"].Visible = false; gradeGridView.Columns["Person"].Visible = false; gradeGridView.Columns["EnrollmentID"].Visible = false; gradeGridView.AllowUserToAddRows = false; gradeGridView.AllowUserToDeleteRows = false;
Drücken Sie STRG + F5, um die Anwendung auszuführen. Sie können die Informationen über die Noten der Studenten nun anzeigen, indem Sie auf View Grades klicken und einen Studenten aus der Dropdownliste im Grade Viewer-Formular auswählen.
Codelisting
Dieser Abschnitt enthält die endgültige Version der CodeBehind-Datei für das GradeViewer-Formular.
Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class GradeViewer
' Create an ObjectContext instance based on SchoolEntity.
Private schoolContext As SchoolEntities
Private Sub GradeViewer_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' Initialize schoolContext.
schoolContext = New SchoolEntities()
' Define the query to retrieve students.
Dim studentQuery As ObjectQuery(Of Person) = schoolContext _
.People.Where("it.EnrollmentDate is not null") _
.OrderBy("it.LastName")
' Execute and bind the studentList control to the query.
studentList.DataSource = studentQuery _
.Execute(MergeOption.OverwriteChanges)
studentList.DisplayMember = "LastName"
End Sub
Private Sub studentList_SelectedIndexChanged(ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles _
studentList.SelectedIndexChanged
' Get the selected student so we can use the
' PersonID in the function import call.
Dim currentStudent As Person = CType(Me.studentList _
.SelectedItem(), Person)
' Set the data source for the gradeGridView
' to the results returned by the GetStudentGrades
' Function Import.
gradeGridView.DataSource = schoolContext _
.GetStudentGrades(currentStudent.PersonID)
gradeGridView.Columns("Course").Visible = False
gradeGridView.Columns("StudentID").Visible = False
gradeGridView.Columns("Person").Visible = False
gradeGridView.Columns("EnrollmentID").Visible = False
gradeGridView.AllowUserToAddRows = False
gradeGridView.AllowUserToDeleteRows = False
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 GradeViewer : Form
{
// Create an ObjectContext instance based on SchoolEntity.
private SchoolEntities schoolContext;
public GradeViewer()
{
InitializeComponent();
}
private void GradeViewer_Load(object sender, EventArgs e)
{
schoolContext = new SchoolEntities();
// Define the query to retrieve students.
ObjectQuery<Person> studentQuery = schoolContext.People
.Where("it.EnrollmentDate is not null")
.OrderBy("it.LastName");
// Execute and bind the studentList control to the query.
studentList.DataSource = studentQuery
.Execute(MergeOption.OverwriteChanges);
studentList.DisplayMember = "LastName";
}
private void studentList_SelectedIndexChanged(object sender, EventArgs e)
{
// Get the selected student so we can use the
// PersonID in the function import call.
Person currentStudent = (Person)this.studentList
.SelectedItem;
// Set the data source for the gradeGridView
// to the results returned by the GetStudentGrades
// Function Import.
gradeGridView.DataSource = schoolContext
.GetStudentGrades(currentStudent.PersonID);
gradeGridView.Columns["Course"].Visible = false;
gradeGridView.Columns["StudentID"].Visible = false;
gradeGridView.Columns["Person"].Visible = false;
gradeGridView.Columns["EnrollmentID"].Visible = false;
gradeGridView.AllowUserToAddRows = false;
gradeGridView.AllowUserToDeleteRows = false;
}
}
}
Nächste Schritte
Sie haben erfolgreich einen Funktionsimport erstellt, der eine Auflistung von Entitätstypen abruft. 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