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

许多应用程序开发人员和数据库管理员都使用存储过程来增强安全性、提供可预测性以及对数据库内的数据封装逻辑。本主题中的示例提供了将存储过程映射到实体数据模型 (EDM) 实现所需的架构语法的基本元素。然后,使用数据模型的应用程序中的代码可以调用存储过程。

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

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

AdventureWorks 销售模型定义了五个实体:

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

下面的数据库脚本和架构节选用于实现一个存储过程,该存储过程返回 SalesOrderDetail 表中包含的与单个 SalesOrderHeader 相关的数据。(销售模型中的 FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID 关联可实现与本示例相同的功能)。

在数据库中创建存储过程

  • 使用 SQL Server Management Studio 或查询命令语法执行以下查询命令,此查询命令在 AdventureWorks 数据库中实现存储过程。

    USE [AdventureWorks]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    IF OBJECT_ID ( 'dbo.GetOrderDetails', 'P' ) IS NOT NULL 
        DROP PROCEDURE dbo.GetOrderDetails;
    GO
    
    CREATE PROCEDURE [dbo].[GetOrderDetails] 
       @SalesOrderHeaderId int 
    AS
        SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber,
         OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount,
         rowguid, ModifiedDate, LineTotal
       FROM Sales.SalesOrderDetail
    WHERE SalesOrderID = @SalesOrderHeaderId;
    

实现存储架构定义语言 (SSDL) 要求

  1. 打开 SSDL 文件。

  2. 在架构标记内部、但在 EntityContainer 标记外部添加以下函数语法。

<Function Name="GetOrderDetails" Aggregate="false" 
    BuiltIn="false" NiladicFunction="false" 
    IsComposable="false" 
    ParameterTypeSemantics="AllowImplicitConversion" 
    Schema="dbo">
        <Parameter Name="SalesOrderHeaderId" Type="int" Mode="In" />
</Function>

实现概念架构定义语言 (CSDL) 要求

  1. 打开 CSDL 文件。

  2. 将下面的 FunctionImport 添加到 CSDL 段的 EntityContainer 中。

    <FunctionImport Name="GetOrderDetails"
        EntitySet="SalesOrderDetail"
        ReturnType="Collection(AdventureWorksModel.SalesOrderDetail)">
      <Parameter Name="SalesOrderHeaderId" Type="Int32" Mode="In">
      </Parameter>
    </FunctionImport>
    

实现映射规范语言 (MSL) 要求

  1. 打开该文件。

  2. 添加下面的 EntityContainerMapping 语法。

    <FunctionImportMapping FunctionImportName="GetOrderDetails"
      FunctionName="AdventureWorksModel.Store.GetOrderDetails"/>
    
  3. 重新生成模型。

另请参见

任务

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

概念

存储过程支持(实体框架)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)