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的存儲過程時要一起配置,只配置三個操作中的一個是不允許的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM