通過Tom Dykstra的Getting Started with Entity Framework 6 Code First using MVC 5教程,part 9涵蓋了如何設置EF6以使用CUD的存儲過程。CUD的存儲過程:腳手架插入存儲過程中兩個SELECT語句的用途是什麼?
當DepartmentSP
遷移經由包管理控制檯添加,以下CreateStoredProcedure()調用自動生成以創建Department_Insert存儲過程:
CreateStoredProcedure(
"dbo.Department_Insert",
p => new
{
Name = p.String(maxLength: 50),
Budget = p.Decimal(precision: 19, scale: 4, storeType: "money"),
StartDate = p.DateTime(),
InstructorID = p.Int(),
},
body:
@"INSERT [dbo].[Department]([Name], [Budget], [StartDate], [InstructorID])
VALUES (@Name, @Budget, @StartDate, @InstructorID)
DECLARE @DepartmentID int
SELECT @DepartmentID = [DepartmentID]
FROM [dbo].[Department]
WHERE @@ROWCOUNT > 0 AND [DepartmentID] = scope_identity()
SELECT t0.[DepartmentID]
FROM [dbo].[Department] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DepartmentID] = @DepartmentID"
);
爲什麼有在自動生成的存儲在兩個SELECT
語句程序?
我測試了以下簡化:
CreateStoredProcedure(
"dbo.Department_Insert",
p => new
{
Name = p.String(maxLength: 50),
Budget = p.Decimal(precision: 19, scale: 4, storeType: "money"),
StartDate = p.DateTime(),
InstructorID = p.Int(),
},
body:
@"INSERT [dbo].[Department]([Name], [Budget], [StartDate], [InstructorID])
VALUES (@Name, @Budget, @StartDate, @InstructorID)
SELECT t0.[DepartmentID]
FROM [dbo].[Department] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DepartmentID] = scope_identity()"
);
...這似乎很好地工作,但我可能失去了一些東西。我已閱讀What's New in Entity Framework 6 (Plus How To Upgrade!)和Code First Insert/Update/Delete Stored Procedure Mapping spec。另外,我查看了EF6 git commit history,發現commit 1911dc7,這是遷移中啓用存儲過程腳手架的第一部分。