Compartir a través de


Cómo ejecutar una consulta con un procedimiento almacenado (Entity Framework)

Muchos desarrolladores de aplicaciones y administradores de bases de datos utilizan procedimientos almacenados para exigir la seguridad, proporcionar previsibilidad y encapsular la lógica en datos dentro de la base de datos. El código de aplicación que recupera los datos que están asignados a un procedimiento almacenado utiliza una función identificada por el elemento FunctionImport. Los elementos básicos de la sintaxis del esquema necesario para asignar un procedimiento almacenado a la implementación de un Entity Data Model (EDM) se describen en Cómo definir un modelo con un procedimiento almacenado (Entity Framework).

El EDM admite dos tipos de asignación de procedimientos almacenados. Para obtener más información sobre cómo asignar procedimientos almacenados que actualizan datos, vea Compatibilidad con los procedimientos almacenados (Entity Framework).

Los ejemplos de este tema se basan en el modelo Adventure Works Sales. Para ejecutar el código de este ejemplo, debe haber agregado ya el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para usar Entity Framework. Para ello, complete los procedimientos de Cómo configurar manualmente un proyecto de Entity Framework y Cómo definir manualmente un modelo Entity Data Model (Entity Framework).

En el esquema se definen cinco entidades:

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

Los pasos siguientes implementan una aplicación cliente y código que ejecuta un procedimiento almacenado asignados al GetOrderDetailsFunctionImport en el esquema conceptual del modelo de datos. La función recupera las entidades SalesOrderDetail relacionadas con un SalesOrderHeader determinado. (La asociación de FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID en este modelo puede hacer lo mismo que este ejemplo).

Para crear el procedimiento almacenado en la base de datos

  1. Cree una aplicación de consola.

  2. Agregue una referencia a la DLL implementada en el tema Cómo definir un modelo con un procedimiento almacenado (Entity Framework).

  3. Agregue referencias a System.Data.Entity y System.Runtime.Serialization.

  4. Agregue la directiva del preprocesador para el AdventureWorksModel implementado en Cómo definir un modelo con un procedimiento almacenado (Entity Framework).

Ejemplo

El procedimiento almacenado se utiliza con el parámetro necesario para un SalesOrderHeaderId. Puede buscar la sintaxis en el Explorador de objetos como un método en el espacio de nombres AdventureWorksEntities: GetOrderDetails(int). El código siguiente ejecuta el procedimiento almacenado para devolver los resultados que se enumeran a continuación en un bucle foreach.

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());
                }

            }
        }
    }
}

El resultado presentará la siguiente apariencia:

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

Vea también

Tareas

Cómo definir un modelo con un procedimiento almacenado (Entity Framework)

Conceptos

Modelo AdventureWorks Sales (EDM)
Compatibilidad con los procedimientos almacenados (Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)