如何:使用存储过程执行查询(实体框架)

许多应用程序开发人员和数据库管理员都使用存储过程来增强安全性、提供可预测性以及对数据库内的数据封装逻辑。检索映射到存储过程的数据的应用程序代码使用由 FunctionImport 元素标识的函数。如何:使用存储过程定义模型(实体框架) 中介绍了将存储过程映射到实体数据模型 (EDM) 实现所需的架构语法的基本元素。

EDM 支持两种存储过程映射。有关映射用于更新数据的存储过程的更多信息,请参见存储过程支持(实体框架)

本主题中的示例基于 Adventure Works 销售模型。若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用实体框架。为此,请完成如何:手动配置实体框架项目如何:手动定义实体数据模型(实体框架) 中的过程。

此架构中定义了五个实体:

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

以下步骤实现一个客户端应用程序,以及一段执行存储过程的代码,该存储过程映射到数据模型的概念架构中的 GetOrderDetailsFunctionImport。该函数检索与给定 SalesOrderHeader 相关的 SalesOrderDetail 实体。(此模型中的 FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID 关联可以实现与此示例相同的功能。)

在数据库中创建存储过程

  1. 创建控制台应用程序。

  2. 添加对主题如何:使用存储过程定义模型(实体框架)中实现的 dll 的引用。

  3. 添加对 System.Data.EntitySystem.Runtime.Serialization 的引用。

  4. 为在如何:使用存储过程定义模型(实体框架)中实现的 AdventureWorksModel 添加预处理器指令。

示例

存储过程中使用了 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

另请参见

任务

如何:使用存储过程定义模型(实体框架)

概念

AdventureWorks 销售模型 (EDM)
存储过程支持(实体框架)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)