EF CodeFirst系列(6)---FluentApi配置存储过程

 


FluentApi配置存储过程

1.EF自动生成存储过程

  EF6的CodeFirst开发模式支持给实体的CUD操作配置存储过程,当我们执行SaveChanges()方法时EF不在生成INSERT,UPDATE,DELETE命令,而是生成CUD操作的存储过程,我们也可以给实体CUD操作指定自定义的存储过程。

一个栗子:

我们给学生实体的CUD操作设置存储过程,Student实体如下:

class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }
    public DateTime BirthDay { get; set; }
}

使用MapToStoredProcedures()方法可以让实体的CUD操作通过存储过程实现(这些存储过程由EF API自动生成),使用代码如下:

复制代码
public class SchoolContext: DbContext 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
                    //.MapToStoredProcedures();
    }

    public DbSet<Student> Students { get; set; }
}
复制代码

运行一下代码:

复制代码
   class Program
    {
        static void Main(string[] args)
        {
            using (SchoolContext context=new SchoolContext())
            {
                //记录发往数据库的命令
                context.Database.Log = Console.Write;
                //添加
                Student stu1 = new Student() { StudentName = "Jack", Birthday = DateTime.Now.AddYears(-18) };
                context.Students.Add(stu1);
                context.SaveChanges();
                //修改
                stu1.StudentName = "Tom";
                context.SaveChanges();
                //删除
                context.Students.Remove(stu1);
                context.SaveChanges();
            }
        }
    }
复制代码

运行结果如下:

如果取消上边代码中MapToStoredProcedures()方法的注释,那么运行后数据库添加了如下的存储过程:

程序运行结果如下:

 2.给实体配置自定义存储过程

EF6中允许我们使用自定义存储过程并将其映射到对应的实体。我们也可以配置存储过程的参数。一个简单的栗子:

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实体的CUD操作分别映射到sp_InsertStudentsp_UpdateStudentand sp_DeleteStudent三个存储过程,同时也配置了存储过程参数和实体属性间的映射。

3.给所有实体配置存储过程

  我们可以将所有实体的CUD操作都配置为存储过程形式的,使用如下代码就可以轻松实现:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Types().Configure(t => t.MapToStoredProcedures());
}

注意:只用FluentApi可以配置存储过程的映射,数据注释属性不支持配置存储过程。我们配置实体CUD的存储过程时要一起配置,只配置三个操作中的一个是不允许的。

 

posted @   捞月亮的猴子  阅读(1826)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示