欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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_insertstudent_update 和student_delete存储过程。

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

 

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