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为您执行此操作,请按照以下步骤操作:
- 双击您的EDMX文件
- 从数据库中选择更新模型
您将看到类似于下面的对话框:
- 确保您已选中如图所示的方框。
这将添加存储过程,您将在模型浏览器中看到它,如下所示:
- 如果要更改EF自动生成的类名,请执行此操作。 我强烈建议您这样做,并为您的类提供符合.NET命名约定的有意义的名称。 我遵循的约定是从存储过程名称中删除任何动词,并将结果一词附加到结尾。 所以你最终得到的名字如下所示:
- 按确定
一些笔记
这比手动编写类要好得多,以防您的存储过程名称或所需的参数或返回的结果发生变化。 此方法也适用于用户定义的函数。
一个陷阱
有时存储过程不会出现在向导对话框中的选择中,也就是这样 。 只需将其添加到存储过程的开头:
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");