zoukankan      html  css  js  c++  java
  • 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的存储过程时要一起配置,只配置三个操作中的一个是不允许的。

  • 相关阅读:
    一款你不容错过的Laravel后台管理扩展包 —— Voyager
    关于后台动态模板添加内容的总结 Builder使用
    Python 解决 :NameError: name 'reload' is not defined 问题
    thinkcmf,thinksns,thinkphp,onethink三者是什么关系?
    PHP中用下划线开头的变量含义
    NetBeans 时事通讯(刊号 # 77 Oct 21, 2009)
    NetBeans 时事通讯(刊号 # 78 Oct 27, 2009)
    最受欢迎的中国 50 技术博客评选结果
    祝父亲生日快乐
    最受欢迎的中国 50 技术博客评选结果
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9682591.html
Copyright © 2011-2022 走看看