EF6的CodeFirst開發模式支持給實體的CUD操做配置存儲過程,當咱們執行SaveChanges()方法時EF不在生成INSERT,UPDATE,DELETE命令,而是生成CUD操做的存儲過程,咱們也能夠給實體CUD操做指定自定義的存儲過程。數據庫
一個栗子:ide
咱們給學生實體的CUD操做設置存儲過程,Student實體以下:ui
class Student { public int StudentId { get; set; } public string StudentName { get; set; } public DateTime BirthDay { get; set; } }
使用MapToStoredProcedures()方法能夠讓實體的CUD操做經過存儲過程實現(這些存儲過程由EF API自動生成),使用代碼以下:spa
public class SchoolContext: DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Student>() //.MapToStoredProcedures(); } public DbSet<Student> Students { get; set; } }
運行一下代碼:code
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(); } } }
運行結果以下:blog
若是取消上邊代碼中MapToStoredProcedures()方法的註釋,那麼運行後數據庫添加了以下的存儲過程:開發
程序運行結果以下:get
EF6中容許咱們使用自定義存儲過程並將其映射到對應的實體。咱們也能夠配置存儲過程的參數。一個簡單的栗子:string
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_InsertStudent
, sp_UpdateStudent
and sp_DeleteStudent三個存儲過程,同時也配置了存儲過程參數和實體屬性間的映射。
it
咱們能夠將全部實體的CUD操做都配置爲存儲過程形式的,使用以下代碼就能夠輕鬆實現:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Types().Configure(t => t.MapToStoredProcedures()); }
注意:只用FluentApi能夠配置存儲過程的映射,數據註釋屬性不支持配置存儲過程。咱們配置實體CUD的存儲過程時要一塊兒配置,只配置三個操做中的一個是不容許的。