Gespeicherte Prozeduren für Designer-Abfragen

In dieser schrittweisen exemplarischen Vorgehensweise wird gezeigt, wie Sie mit dem Entity Framework Designer (EF Designer) gespeicherte Prozeduren in ein Modell importieren und dann die importierten gespeicherten Prozeduren aufrufen, um Ergebnisse abzurufen.

Beachten Sie, dass Code First die Zuordnung zu gespeicherten Prozeduren oder Funktionen nicht unterstützt. Sie können gespeicherte Prozeduren oder Funktionen jedoch mithilfe der Methode „System.Data.Entity.DbSet.SqlQuery“ aufrufen. Beispiel:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

Voraussetzungen

Für diese exemplarische Vorgehensweise gelten folgende Voraussetzungen:

Einrichten des Projekts

  • Öffnen Sie Visual Studio 2012.
  • Wählen Sie Datei -> Neu -> Projekt aus.
  • Klicken Sie im linken Bereich auf Visual C#, und wählen Sie dann die Vorlage Konsole aus.
  • Geben Sie EFwithSProcsSample als Namen ein.
  • Klicken Sie auf OK.

Modellerstellung

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Hinzufügen -> Neues Element aus.

  • Wählen Sie Daten im linken Menü aus, und wählen Sie dann im Bereich „Vorlagen“ ADO.NET Entity Data Model aus.

  • Geben Sie EFwithSProcsModel.edmx als Dateinamen ein, und klicken Sie dann auf Hinzufügen.

  • Wählen Sie im Dialogfeld „Modellinhalt auswählen“ Aus Datenbank generieren aus, und klicken Sie dann auf Weiter.

  • Klicken Sie auf Neue Verbindung.
    Geben Sie im Dialogfeld „Verbindungseigenschaften“ den Servernamen ein (z. B. (localdb)\mssqllocaldb), wählen Sie die Authentifizierungsmethode aus, geben Sie School als Datenbanknamen ein, und klicken Sie dann auf OK.
    Das Dialogfeld „Datenverbindung auswählen“ wird mit Ihrer Datenbankverbindungseinstellung aktualisiert.

  • Aktivieren Sie im Dialogfeld „Datenbankobjekte auswählen“ das Kontrollkästchen Tabellen, um alle Tabellen auszuwählen.
    Wählen Sie außerdem die folgenden gespeicherten Prozeduren unter dem Knoten Gespeicherte Prozeduren und Funktionen aus: GetStudentGrades und GetDepartmentName.

    Import Stored Procedures

    Ab Visual Studio 2012 unterstützt der EF Designer den Massenimport gespeicherter Prozeduren. Ausgewählte gespeicherte Prozeduren und Funktionen in das Entitätsmodell importieren ist standardmäßig aktiviert.

  • Klicken Sie auf Fertig stellen.

Standardmäßig wird die Ergebnisform jeder importierten gespeicherten Prozedur oder Funktion, die mehr als eine Spalte zurückgibt, automatisch zu einem neuen komplexen Typ. In diesem Beispiel möchten wir die Ergebnisse der Funktion GetStudentGrades der Entität StudentGrade und die Ergebnisse der Funktion GetDepartmentName zu none zuordnen (none ist der Standardwert).

Damit ein Funktionsimport einen Entitätstyp zurückgibt, müssen die von der entsprechenden gespeicherten Prozedur zurückgegebenen Spalten genau mit den skalaren Eigenschaften des zurückgegebenen Entitätstyps übereinstimmen. Ein Funktionsimport kann auch Auflistungen von einfachen Typen, komplexen Typen oder keinen Wert zurückgeben.

  • Klicken Sie mit der rechten Maustaste auf der Designoberfläche, und wählen Sie Modellbrowser aus.
  • Wählen Sie in Modellbrowser die Option Funktionsimporte aus, und doppelklicken Sie dann auf die Funktion GetStudentGrades.
  • Wählen Sie im Dialogfeld „Funktionsimport bearbeiten“ die Option Entitäten und dann StudentGrade aus.
    Im Kontrollkästchen Funktionsimport ist zusammensetzbar am oberen Rand des Dialogfelds Funktionsimporte können Sie zu zusammensetzbaren Funktionen zuordnen. Wenn Sie dieses Kontrollkästchen aktivieren, werden in der Dropdownliste Name der gespeicherten Prozedur/Funktion nur zusammensetzbare Funktionen (Tabellenwertfunktionen) angezeigt. Wenn Sie dieses Kontrollkästchen nicht aktivieren, werden nur nicht zusammensetzbare Funktionen in der Liste angezeigt.

Verwenden des Modells

Öffnen Sie die Datei Program.cs, in der die Methode Main definiert ist. Fügen Sie der Funktion „Main“ den folgenden Code hinzu.

Der Code ruft zwei gespeicherte Prozeduren auf: GetStudentGrades (gibt StudentGrades für die angegebene StudentId zurück) und GetDepartmentName (gibt den Namen der Abteilung im Ausgabeparameter zurück).  

    using (SchoolEntities context = new SchoolEntities())
    {
        // Specify the Student ID.
        int studentId = 2;

        // Call GetStudentGrades and iterate through the returned collection.
        foreach (StudentGrade grade in context.GetStudentGrades(studentId))
        {
            Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
            Console.WriteLine("Student grade: " + grade.Grade);
        }

        // Call GetDepartmentName.
        // Declare the name variable that will contain the value returned by the output parameter.
        ObjectParameter name = new ObjectParameter("Name", typeof(String));
        context.GetDepartmentName(1, name);
        Console.WriteLine("The department name is {0}", name.Value);

    }

Kompilieren Sie die Anwendung, und führen Sie sie aus. Das Programm erzeugt die folgende Ausgabe:

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

Ausgabeparameter

Wenn Ausgabeparameter verwendet werden, sind ihre Werte erst verfügbar, wenn die Ergebnisse vollständig gelesen wurden. Dies liegt an dem zugrunde liegenden Verhalten von „DbDataReader“, weitere Details finden Sie unter Abrufen von Daten mit „DataReader“.