10-8. 映射插入、修改、刪除操作到存儲過程問題想要映射插入、修改、刪除操作到存儲過程解決方案假設已有運動員實體模型,如Figure 10-8所示. 對應的資料庫表如Figure 10-9所示. 我們想要用存儲過程來執行插入,修改,刪除操作。Figure 10-8. 運動員實體模型Figure 1...
10-8. 映射插入、修改、刪除操作到存儲過程
問題
想要映射插入、修改、刪除操作到存儲過程
解決方案
假設已有運動員實體模型,如Figure 10-8所示. 對應的資料庫表如Figure 10-9所示. 我們想要用存儲過程來執行插入,修改,刪除操作。
Figure 10-8. 運動員實體模型
Figure 10-9. 包含一些基本信息的運動員表
為實體映射存儲過程到插入,修改,刪除操作,執行以下操作:
1.在資料庫里,創建如Listing 10-21所示的存儲過程
Listing 10-21. The Stored Procedures for the Insert, Update, and Delete Actions
create procedure [chapter10].[InsertAthlete]
(@Name varchar(50), @Height int, @Weight int)
as
begin
insert into Chapter10.Athlete values (@Name, @Height, @Weight)
select SCOPE_IDENTITY() as AthleteId
end
go
create procedure [chapter10].[UpdateAthlete]
(@AthleteId int, @Name varchar(50), @Height int, @Weight int)
as
begin
update Chapter10.Athlete set Name = @Name, Height = @Height, [Weight] = @Weight
where AthleteId = @AthleteId
end
go
create procedure [chapter10].[DeleteAthlete]
(@AthleteId int)
as
begin
delete from Chapter10.Athlete where AthleteId = @AthleteId
end
2. 右擊模型設計視圖,選擇“從資料庫更新模型”,選擇上面創建的三個存儲過程,單擊“完成”,這樣存儲過程就添加到了模型中
3. 右擊Athlete實體, 選擇“存儲過程映射”,為每個操作選擇對應的存儲過程. 為插入操作的“結果列綁定” AthleteId (見Figure 10-10).
Figure 10-10. 映射存儲過程,參數,和返回值 後的操作、修改、刪除操作
它是如何工作的?
我們用存儲過程更新了模型,這樣模型就可以使用存儲過程了,然後我們映射存儲過程到實體的插入、修改、刪除操作上.
在本小節, 我們儘可能讓存儲過程簡單. 它們從實體屬性里獲取參數,並且執行操作.插入操作里我們需要返回存儲過程返回自增列的ID值給實體.所以需要把存儲過程返回的Id值映射到實體的AthleteId屬性,這一步很重要.沒有這一步,EF不能獲取新創建的實體ID。
你可能會問“我什麼時候把存儲過程映射到實體操作了?”,其實大多數情況下,EF會自動為插入、修改、刪除操作生成高效的代碼。
你可能也會想知道:“那我什麼時候需要用存儲過程來映射操作?”,這個問題的答案有個最佳的實踐:
當你公司要求你用存儲過程插入、修改、刪除來操作表的時候。
你有一個額外的任務,需要執行額外的操作.比如, 你想要管理一個審計運算或執行一些複雜的業務邏輯, 又或是對一個用戶進行許可權安全檢查等。
你的實體基於查詢視圖(QueryView) (見第6章和15章)
static void Main(string[] args)
{
using (var context = new EFRecipesEntities1008())
{
context.Database.ExecuteSqlCommand("delete from chapter10.Athlete");
context.Athletes.Add(new Athlete
{
Name = "Nancy Steward",
Height = 167,
Weight = 53
});
context.Athletes.Add(new Athlete
{
Name = "Rob Achers",
Height = 170,
Weight = 77
});
context.Athletes.Add(new Athlete
{
Name = "Chuck Sanders",
Height = 171,
Weight = 82
});
context.Athletes.Add(new Athlete
{
Name = "Nancy Rodgers",
Height = 166,
Weight = 59
});
context.SaveChanges();
}
using (var context = new EFRecipesEntities1008())
{
var all = context.Athletes;
context.Athletes.Remove(all.First(o => o.Name == "Nancy Steward"));
all.First(o => o.Name == "Rob Achers").Weight = 80;
context.SaveChanges();
}
using (var context = new EFRecipesEntities1008())
{
Console.WriteLine("All Athletes");
Console.WriteLine("============");
foreach (var athlete in context.Athletes)
{
Console.WriteLine("{0} weighs {1} Kg and is {2} cm in height",
athlete.Name, athlete.Weight, athlete.Height);
}
}
Console.WriteLine("\nPress any key to exit...");
Console.ReadKey();
}
輸出結果如下Listing 10-22所示:
All Athletes
============
Rob Achers weighs 80 Kg and is 170 cm in height
Chuck Sanders weighs 82 Kg and is 171 cm in height
Nancy Rodgers weighs 59 Kg and is 166 cm in height