设计器查询存储过程Designer Query Stored Procedures

此分步演练演示如何使用 Entity Framework Designer (EF 设计器)将存储过程导入到模型中,然后调用导入的存储过程来检索结果。

请注意,Code First 不支持映射到存储过程或函数。 但是,可以使用 DbSet. SqlQuery 方法调用存储过程或函数。 例如:

  1. var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

先决条件Prerequisites

若要完成此演练,您需要:

设置项目Set up the Project

  • 打开 Visual Studio 2012。
  • 选择 “文件->”> 项目
  • 在左窗格中,单击 “ Visual C# “,然后选择 “控制台“ 模板。
  • 输入 “ EFwithSProcsSample “ 作为名称。
  • 选择“确定”。 ****

创建模型Create a Model

  • 在解决方案资源管理器中右键单击项目,然后选择 “添加-> 新项“。

  • 从左侧菜单中选择 “数据“,然后在 “模板” 窗格中选择 “ ADO.NET 实体数据模型

  • 输入EFwithSProcsModel作为文件名,然后单击 “添加“。

  • 在 “选择模型内容” 对话框中,选择 “ 从数据库生成“,然后单击 “ 下一步“。

  • 单击 “ 新建连接“。
    在 “连接属性” 对话框中,输入服务器名称(例如, (localdb)\mssqllocaldb),选择身份验证方法,为数据库名称键入 School ,然后单击 “确定”
    “选择您的数据连接” 对话框将通过数据库连接设置进行更新。

  • 在 “选择数据库对象” 对话框中,选中 “ “ 复选框以选择所有表。
    另外,在 “存储过程和函数“ 节点下选择以下存储过程: GetStudentGradesGetDepartmentName

    导入

    从 Visual Studio 2012 开始,EF 设计器支持存储过程的大容量导入。默认情况下,将选中 “将选定的存储过程和函数导入 entity 模型“。

  • 单击 “ 完成“。

默认情况下,返回多个列的每个导入的存储过程或函数的结果形状将自动成为新的复杂类型。 在此示例中,我们想要将 GetStudentGrades函数的结果映射到 StudentGrade实体,并将GetDepartmentName结果映射到 ““ (默认值为 ““)。

为了使函数导入返回实体类型,由相应的存储过程返回的列必须与返回的实体类型的标量属性完全匹配。 函数导入还可以返回简单类型、复杂类型或无值的集合。

  • 右键单击设计图面,然后选择 “ 模型浏览器“。
  • 模型浏览器中,选择 “ 函数导入“,然后双击 “ GetStudentGrades “ 函数。
  • 在 “编辑函数导入” 对话框中,选择 “ 实体“ 然后选择 “ StudentGrade“。
    函数导入对话框顶部的 “函数导入是可组合的” 复选框允许您映射到可组合函数。如果选中此复选框,则 “存储过程/函数名称“ 下拉列表中将只显示可组合函数(表值函数)。如果不选中此框,则列表中将只显示不可组合的函数。

使用模型Use the Model

打开Program.cs文件,其中定义了Main方法。 将以下代码添加到 Main 函数中。

此代码将调用两个存储过程: GetStudentGrades (为指定的StudentId返回StudentGrades )和GetDepartmentName (返回 output 参数中部门的名称)。

  1. using (SchoolEntities context = new SchoolEntities())
  2. {
  3. // Specify the Student ID.
  4. int studentId = 2;
  5. // Call GetStudentGrades and iterate through the returned collection.
  6. foreach (StudentGrade grade in context.GetStudentGrades(studentId))
  7. {
  8. Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
  9. Console.WriteLine("Student grade: " + grade.Grade);
  10. }
  11. // Call GetDepartmentName.
  12. // Declare the name variable that will contain the value returned by the output parameter.
  13. ObjectParameter name = new ObjectParameter("Name", typeof(String));
  14. context.GetDepartmentName(1, name);
  15. Console.WriteLine("The department name is {0}", name.Value);
  16. }

编译并运行该应用程序。 该程序生成以下输出:

  1. StudentID: 2
  2. Student grade: 4.00
  3. StudentID: 2
  4. Student grade: 3.50
  5. The department name is Engineering

输出参数Output Parameters

如果使用了 output 参数,则在完全读取结果之前,它们的值将不可用。 这是因为 DbDataReader 的基础行为,有关详细信息,请参阅使用 DataReader 检索数据