当前位置: 移动技术网 > IT编程>开发语言>.net > 16.翻译系列:EF 6 Code -First中使用存储过程【EF 6 Code-First系列】

16.翻译系列:EF 6 Code -First中使用存储过程【EF 6 Code-First系列】

2019年04月14日  | 移动技术网IT编程  | 我要评论

袁高亮,端木云,禁品乱欲品菊弄箫

原文链接:

当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_insertstudent_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存储过程。仅仅是映射其中一个,是不被允许的。

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网