原文鏈接: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_Insert
, Student_Update
和Student_Delete存儲過程。
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存儲過程。僅僅是映射其中一個,是不被允許的。