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

可以通过以下两种方式在概念模型中公开数据库中定义的存储过程:

  • 可以在概念模型中创建映射到存储过程的函数导入。 这将允许您针对 ObjectContext 定义一个执行数据库中的存储过程的方法。 根据存储过程的定义方式不同,对应的函数导入可以返回实体类型,也可以返回复杂类型。

  • 可以将实体类型的插入、更新和删除操作映射到存储过程。 这样,您可以为实体类型定义自定义的插入、更新和删除行为。

    Bb896279.note(zh-cn,VS.100).gif注意:
    如果没有将实体类型的插入、更新和删除这三种操作全部映射到存储过程,则在运行时执行的情况下未映射的操作将失败且会引发 UpdateException

本主题介绍如何在概念模型中创建映射到数据库中的存储过程的函数导入。 有关将实体类型的插入、更新和删除操作映射到存储过程的信息,请参见如何:定义具有修改存储过程的模型(实体框架)

创建映射到存储过程的函数导入的建议方法是使用 ADO.NET Entity Data Model Tools。 有关使用实体数据模型工具的信息,请参见以下主题:

您也可以手动编辑模型和映射文件以创建映射到存储过程的函数导入。 本主题中的示例演示如何执行此操作,并且此示例基于 School 示例数据库School 模型。 有关从 School 数据库生成 School 模型的信息,请参见 EDM 生成器 (EdmGen.exe)。 假定您已在数据库中定义了一个存储过程,那么创建映射到该存储过程的函数导入的基本步骤将如下所示:

  1. 向存储模型中添加一个 Function 元素,指定数据库中的存储过程。

  2. 向概念模型中添加一个 FunctionImport 元素,指定概念模型中的函数导入。

  3. 向映射文件中添加一个 FunctionImportMapping 元素,将概念模型中的函数导入映射到存储模型中的函数。

本主题中的步骤说明如何创建 FunctionFunctionImportFunctionImportMapping 元素以将下面的存储过程导入到概念模型中:

IF NOT EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID(N'[dbo].[GetStudentGrades]') 
            AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
CREATE PROCEDURE [dbo].[GetStudentGrades]
            @StudentID int
            AS
            SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade
            WHERE StudentID = @StudentID
' 
END
GO

将 Function 元素添加到存储模型

  1. 打开存储模型(.ssdl 文件)。

  2. 将下面的 Function 元素添加为 Schema 元素的子级:

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

将 FunctionImport 元素添加到概念模型

  1. 打开概念模型(.csdl 文件)。

  2. 将下面的 FunctionImport 元素添加为 EntityContainer 元素的子级。

    <FunctionImport Name="GetStudentGrades" EntitySet="StudentGrades" 
                    ReturnType="Collection(SchoolModel.StudentGrade)">
      <Parameter Name="StudentID" Mode="In" Type="Int32" />
    </FunctionImport>
    

将 FunctionImportMapping 元素添加到映射文件

  1. 打开映射文件(.msl 文件)。

  2. 将下面的 FunctionImportMapping 元素添加为 EntityContainerMapping 元素的子级。

    <FunctionImportMapping FunctionImportName="GetStudentGrades" 
                           FunctionName="SchoolModel.Store.GetStudentGrades" />
    

另请参见

其他资源

定义高级数据模型(实体框架任务)
How to: Define Custom Functions in the Storage Model
CSDL、SSDL 和 MSL 规范