Entity Framework中的存储过程
Entity Framework能够基于LINQ-to-Entities或Entity SQL查询自动为数据库构建本地命令,以及构建用于插入、更新和删除数据的命令。您可能希望重写这些步骤,并使用您自己的预定义存储过程。您可以使用存储过程获取数据,也可以为一个或多个数据库表添加/更新/删除记录。
EF API为目标数据库中的每个存储过程和用户定义函数(UDF)在EDM中创建一个函数,而不是一个实体。
让我们使用存储过程从数据库中获取数据。
首先,在SQL Server数据库中创建以下存储过程GetCoursesByStudentId。这个过程返回分配给特定学生的所有课程。
CREATE PROCEDURE [dbo].[GetCoursesByStudentId]
-- Add the parameters for the stored procedure here
@StudentId int = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
select c.courseid, c.coursename,c.Location, c.TeacherId
from student s
left outer join studentcourse sc on sc.studentid = s.studentid
left outer join course c on c.courseid = sc.courseid
where s.studentid = @StudentId
END
现在,在Visual Studio的解决方案资源管理器中右键单击项目,添加一个新的实体数据模型(2012/2015/2017)-> add -> new Item。这将打开一个添加新项目弹出窗口。在弹出窗口中,选择ADO.NET实体数据模型,并为EDM提供适当的名称,然后单击Add按钮。这将打开实体数据模型向导。选择EF Designer from database并单击Next按钮,如下所示。
接下来,您需要创建一个与现有数据库的连接。如果这是您第一次为数据库创建EDM,那么您需要通过单击new connection…按钮。在这里,我们已经有了一个连接,因此从下拉菜单中选择数据库并单击Next按钮。
在这一步中,在Stored Procedures and Functions下选择GetCoursesByStudentId。确保选中了Import selected stored procedures and functions into the entity model复选框,然后单击Finish。
您将看到GetCoursesByStudentId存储过程添加在如下所示的存储过程/函数和函数导入中,并在模型浏览器中使用新的复杂类型GetCoursesByStudentId_Result。每当您将存储过程或UDF导入EDM时,EDM默认会创建一个名为{sp name}_Result的新复杂类型。
GetCoursesByStudentId返回Course实体中定义的相同字段。因此,我们不需要为GetCoursesByStudentId添加一个新的复杂类型。您可以通过右键单击函数导入中的GetCoursesByStudentId并选择编辑来更改它。这将打开编辑功能导入弹出如下所示。
将Course实体设置为结果类型,选择“Entities”,在弹出窗口的下拉菜单中选择“Course”,单击“OK”,如下图所示:
这将在context类中添加名为GetCoursesByStudentId的函数(派生自DbContext),如下所示:
现在,你可以使用GetCoursesByStudentId作为函数来获取数据,如下所示:
using (var context = new SchoolDBEntities())
{
var courses = context.GetCoursesByStudentId(1);
foreach (Course cs in courses)
Console.WriteLine(cs.CourseName);
}
上面的例子将在数据库中执行以下语句:
exec [dbo].[GetCoursesByStudentId] @StudentId=1
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/