Freigeben über


Gewusst wie: Ausführen einer Abfrage mithilfe einer gespeicherten Prozedur (Entity Framework)

Viele Anwendungsentwickler und Datenbankadministratoren verwenden gespeicherte Prozeduren, um die Sicherheit zu erhöhen, Vorhersagbarkeit zu erreichen und Logik in der Datenbank zu kapseln. Anwendungscode zum Abrufen von Daten, die einer gespeicherten Prozedur zugeordnet sind, verwendet eine Funktion, die durch das FunctionImport-Element identifiziert wird. Die grundlegenden Elemente der Schemasyntax, die zum Zuordnen einer gespeicherten Prozedur zu einer Entity Data Model-Implementierung (EDM) erforderlich ist, werden unter Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework) beschrieben.

Das EDM unterstützt zwei Arten von Mappings für gespeicherte Prozeduren. Weitere Informationen über das Mapping von gespeicherten Prozeduren für die Datenaktualisierung finden Sie unter Unterstützung für gespeicherte Prozeduren (Entity Framework).

Die Beispiele in diesem Thema basieren auf dem AdventureWorks Sales-Modell. Zum Ausführen des Codes in diesem Beispiel müssen Sie dem Projekt bereits das "AdventureWorks Sales"-Modell hinzugefügt und das Projekt zur Verwendung des Entity Framework konfiguriert haben. Führen Sie dazu die Verfahren unter Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren eines Entity Data Model (Entity Framework) durch.

Im Schema werden fünf Entitäten definiert:

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

Mit folgenden Schritten wird eine Clientanwendung und Clientcode implementiert, der eine dem GetOrderDetailsFunctionImport im konzeptionellen Schema des Datenmodells zugeordnete gespeicherte Prozedur ausführt. Die Funktion ruft SalesOrderDetail-Entitäten ab, die mit einem bestimmten SalesOrderHeader verwandt sind. (Die FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID-Zuordnung in diesem Modell führt die gleichen Aktionen wie dieses Beispiel aus.)

So erstellen Sie die gespeicherte Prozedur in der Datenbank

  1. Erstellen Sie eine Konsolenanwendung.

  2. Fügen Sie einen Verweis auf die im Thema Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework) implementierte DLL hinzu.

  3. Fügen Sie Verweise auf System.Data.Entity und System.Runtime.Serialization hinzu.

  4. Fügen Sie die Präprozessordirektive für das AdventureWorksModel hinzu, das in Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework) implementiert wurde.

Beispiel

Die gespeicherte Prozedur wird mit dem erforderlichen Parameter für eine SalesOrderHeaderId verwendet. Die Syntax können Sie im Objektbrowser als Methode im AdventureWorksEntities-Namespace finden: GetOrderDetails(int). Im folgenden Code wird die gespeicherte Prozedur ausgeführt, deren Ergebnisse dann in einer foreach-Schleife durchlaufen werden.

Option Explicit On
Option Strict On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports AdvWrksSalesModel

Module Module1
    Sub Main()
        Try
            Using db As AdvWksSalesEntities = New AdvWksSalesEntities()
                Dim soHeaderNumber As Integer = 43659
                For Each order As SalesOrderDetail _
                            In db.GetOrderDetails(soHeaderNumber)
                    Console.WriteLine("Header#: {0} " & _
                        "Order#: {1} ProductID: {2} Quantity: {3} Price: {4}", _
                        soHeaderNumber, order.SalesOrderDetailID, order.ProductID, _
                        order.OrderQty, order.UnitPrice)
                Next

            End Using

        Catch ex As System.Data.MappingException
            Console.WriteLine(ex.ToString())
        Catch ex As System.Data.CommandExecutionException
            Console.WriteLine(ex.ToString())
        End Try
    End Sub
End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdvWrksSalesModel;

namespace AdvWksSalesSProcs
{
    class Program
    {
        static void Main(string[] args)
        {
            using (AdvWksSalesEntities objCtx = 
                                new AdvWksSalesEntities())
            {
                try
                {
                    int soHeaderNumber = 43659;
                    foreach (SalesOrderDetail order in
                              objCtx.GetOrderDetails(soHeaderNumber))
                        Console.WriteLine("Header#: {0} " +
                        "Order#: {1} ProductID: {2} Quantity: {3} Price: {4}",
                        soHeaderNumber, order.SalesOrderDetailID,
                        order.ProductID,
                        order.OrderQty, order.UnitPrice);

                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }

            }
        }
    }
}

Die Ausgabe sieht wie folgt aus:

Header#: 43659 Order#: 1 ProductID: 776 Quantity: 1 Price: 2024.9940
Header#: 43659 Order#: 2 ProductID: 777 Quantity: 3 Price: 2024.9940
Header#: 43659 Order#: 3 ProductID: 778 Quantity: 1 Price: 2024.9940
Header#: 43659 Order#: 4 ProductID: 771 Quantity: 1 Price: 2039.9940
Header#: 43659 Order#: 5 ProductID: 772 Quantity: 1 Price: 2039.9940
Header#: 43659 Order#: 6 ProductID: 773 Quantity: 2 Price: 2039.9940
Header#: 43659 Order#: 7 ProductID: 774 Quantity: 1 Price: 2039.9940
Header#: 43659 Order#: 8 ProductID: 714 Quantity: 3 Price: 28.8404
Header#: 43659 Order#: 9 ProductID: 716 Quantity: 1 Price: 28.8404
Header#: 43659 Order#: 10 ProductID: 709 Quantity: 6 Price: 5.7000
Header#: 43659 Order#: 11 ProductID: 712 Quantity: 2 Price: 5.1865
Header#: 43659 Order#: 12 ProductID: 711 Quantity: 4 Price: 20.1865

Siehe auch

Aufgaben

Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework)

Konzepte

AdventureWorks Sales-Modell (EDM)
Unterstützung für gespeicherte Prozeduren (Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)