Поделиться через


Как выполнить запрос с помощью хранимой процедуры (платформа Entity Framework)

Многие разработчики приложений и администраторы баз данных используют хранимые процедуры для обеспечения безопасности, предсказуемости и инкапсулирования логики работы с данными внутри базы данных. В коде приложения для получения данных, сопоставляемых с хранимой процедурой, используется функция, которая определена элементом FunctionImport. Базовые элементы синтаксиса схемы, необходимые для сопоставления хранимой процедуры с реализацией модели EDM, описаны в разделе Как определить модель с помощью хранимой процедуры (платформа Entity Framework).

Модель EDM поддерживает два типа сопоставлений хранимых процедур. Дополнительные сведения о сопоставлении хранимых процедур, обновляющих данные, см. в разделе Поддержка хранимых процедур (платформа Entity Framework).

Примеры в этом разделе основаны на модели Adventure Works Sales. Чтобы запустить код данного примера, необходимо сначала добавить к проекту модель AdventureWorks Sales и настроить проект для использования платформы Entity Framework. Для этого выполните инструкции из разделов Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (платформа Entity Framework).

В этой схеме определены пять сущностей:

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

На последующих шагах будет реализовано клиентское приложение и код, выполняющий хранимую процедуру, сопоставленную с GetOrderDetailsFunctionImport в концептуальной схеме модели данных. Функция получает сущности SalesOrderDetail, связанные с данными SalesOrderHeader (ассоциация FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID в этой модели может выполнять то же, что показано в данном примере).

Создание хранимой процедуры в базе данных

  1. Создайте приложение командной строки.

  2. Добавьте ссылку на файл dll, реализованный в разделе Как определить модель с помощью хранимой процедуры (платформа Entity Framework).

  3. Добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.

  4. Добавьте директиву препроцессора для атрибута AdventureWorksModel, реализация которого описана в разделе Как определить модель с помощью хранимой процедуры (платформа Entity Framework).

Примеры

Эта хранимая процедура используется с обязательным параметром для атрибута SalesOrderHeaderId. Синтаксис можно найти в обозревателе объектов как метод в пространстве имен AdventureWorksEntities: GetOrderDetails(int). Следующий код запускает хранимую процедуру, чтобы вернуть результаты, которые затем будут перечислены в цикле 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());
                }

            }
        }
    }
}

Итоговый вывод будет выглядеть следующим образом:

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

См. также

Задачи

Как определить модель с помощью хранимой процедуры (платформа Entity Framework)

Основные понятия

Модель AdventureWorks Sales (модель EDM)
Поддержка хранимых процедур (платформа Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)