Как выполнить запрос с помощью хранимой процедуры (платформа 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
На последующих шагах будет реализовано клиентское приложение и код, выполняющий хранимую процедуру, сопоставленную с GetOrderDetails
FunctionImport в концептуальной схеме модели данных. Функция получает сущности SalesOrderDetail
, связанные с данными SalesOrderHeader
(ассоциация FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID в этой модели может выполнять то же, что показано в данном примере).
Создание хранимой процедуры в базе данных
Создайте приложение командной строки.
Добавьте ссылку на файл dll, реализованный в разделе Как определить модель с помощью хранимой процедуры (платформа Entity Framework).
Добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.
Добавьте директиву препроцессора для атрибута 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)