16.翻译系列:EF 6 Code -First中使用存储过程【EF 6 Code-First系列】
程序员文章站
2022-03-13 17:52:32
原文链接:https://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx 当SaveChanges方法被调用的时候,EF 6 ......
原文链接:
当savechanges方法被调用的时候,ef 6 可以用来创建并使用增删改存储过程。
我们来为下面的student实体,创建增删改存储过程。
class student { public int studentid { get; set; } public string studentname { get; set; } public datetime dob { get; set; } }
使用maptostoredprocedures()方法,为实体配置默认的存储过程。
public class schoolcontext: dbcontext { protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.entity<student>() .maptostoredprocedures(); } public dbset<student> students { get; set; } }
ef api将会为student实体创建student_insert
, student_update
和student_delete存储过程。
student_insert和student_update存储过程包含student实体的所有属性的参数,student_delete存储过程仅仅包含student的主键属性studentid一个参数:
create procedure [dbo].[student_insert] @studentname [nvarchar](max), @dob [datetime] as begin insert [dbo].[students]([studentname], [dob]) values (@studentname, @dob) declare @studentid int select @studentid = [studentid] from [dbo].[students] where @@rowcount > 0 and [studentid] = scope_identity() select t0.[studentid] from [dbo].[students] as t0 where @@rowcount > 0 and t0.[studentid] = @studentid end create procedure [dbo].[student_update] @studentid [int], @studentname [nvarchar](max), @dob [datetime] as begin update [dbo].[students] set [studentname] = @studentname, [dob] = @dob where ([studentid] = @studentid) end create procedure [dbo].[student_delete] @studentid [int] as begin delete [dbo].[students] where ([studentid] = @studentid) end
为实体映射自定义的存储过程
ef6允许你使用自己的存储过程,你可以像下面这样进行配置,下面的代码为student实体,映射了一个自定义的存储过程。
protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.entity<student>() .maptostoredprocedures(p => p.insert(sp => sp.hasname("sp_insertstudent").parameter(pm => pm.studentname, "name").result(rs => rs.studentid, "id")) .update(sp => sp.hasname("sp_updatestudent").parameter(pm => pm.studentname, "name")) .delete(sp => sp.hasname("sp_deletestudent").parameter(pm => pm.studentid, "id")) ); }
在上面的例子中,student实体映射了三个存储过程,sp_insertstudent、sp_updatestudent、以及sp_deletestudent.当然同样对存储过程的参数进行了配置。
为所有实体配置存储过程
你可以使用下面的代码,为所有实体配置存储过程。
protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.types().configure(t => t.maptostoredprocedures()); }
局限性
- 仅仅只有fluent api才能被用来映射存储过程。ef 6中的数据注解特性,是不能映射存储过程的。
- 如果你想使用cud操作,你就必须为实体映射insert,update以及delete存储过程。仅仅是映射其中一个,是不被允许的。
上一篇: Oracle总结【视图、索引、事务、用户权限、批量操作】
下一篇: 委托与lambda关系
推荐阅读
-
5.翻译系列:EF 6中数据库的初始化(EF 6 Code-First 系列)
-
9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】
-
2.翻译系列:为EF Code-First设置开发环境(EF 6 Code-First系列)
-
11.翻译系列:在EF 6中配置一对零或者一对一的关系【EF 6 Code-First系列】
-
9.7 翻译系列:EF数据注解特性之--InverseProperty【EF 6 Code-First系列】
-
9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
-
9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】
-
9.10 翻译系列:EF数据注解特性之StringLength【EF 6 Code-First系列】
-
21.翻译系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
-
15.翻译系列:EF 6中的级联删除【EF 6 Code-First 系列】