Entity Framework数据库中的存储过程第一种方法

我正在使用Entity Framework数据库第一种方法进行从Webforms到MVC应用程序的项目转换,并准备好数据库以及所有存储过程。

我成功创建了一个.edmx文件,并且能够使用我的存储过程,并且在执行任何插入或更新操作时它工作得很好。 但是当我在我的一个存储过程中使用select查询时出现了真正的问题。

例如,有一个Employee表,其中包含以下列:

 EmpId, FirstName, LastName, Age, Salary 

我有一个存储过程GetAllEmpDetails有以下选择查询。

 Select EmpId, (FirstName + ' ' + LastName) as FullName, Salary from Employee 

现在,当我尝试将此存储过程的结果与根据表结构具有5个属性的Employee类绑定时,我得到一个错误,即Age属性的值是预期的,但它在结果集中不可用。

我知道也没有FullName属性,所以我的问题是如何用生成的模型类解决这个问题(在本例中是Employee ),以便它可以解决这些动态问题?

如何在EF中映射存储过程?

由于您正在使用Database First Approach并且您有EDMX文件,因此让EF为您生成存储过程结果的类。 您可能有许多存储过程,并且您希望避免手动创建类:毕竟这是使用ORM工具的全部要点。 您的某些存储过程也可能包含参数。 按照以下方式进行操作将为您处理所有这些。 它实际上非常简单。

要让EF为您执行此操作,请按照以下步骤操作:

  1. 双击您的EDMX文件
  2. 从数据库中选择更新模型

您将看到类似于下面的对话框:

在此处输入图像描述

  1. 确保您已选中如图所示的方框。

这将添加存储过程,您将在模型浏览器中看到它,如下所示:

在此处输入图像描述

  1. 如果要更改EF自动生成的类名,请执行此操作。 我强烈建议您这样做,并为您的类提供符合.NET命名约定的有意义的名称。 我遵循的约定是从存储过程名称中删除任何动词,并将结果一词附加到结尾。 所以你最终得到的名字如下所示:

在此处输入图像描述

  1. 按确定

一些笔记

这比手动编写类要好得多,以防您的存储过程名称或所需的参数或返回的结果发生变化。 此方法也适用于用户定义的函数。

一个陷阱

有时存储过程不会出现在向导对话框中的选择中,也就是这样 。 只需将其添加到存储过程的开头:

 SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done. 
 public class EmployeeProcedure { [Column("EmpId")] public int EmployeeId { get; set; } [NotMapped] public string FullName { get; set; } public double Salary { get; set; } } 

之后打电话给:

 this.Database.SqlQuery("GetAllEmpDetails");