EF 6 DB-First系列--Entity Framework中的存储过程

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值