实体框架 – 存储过程
实体框架 – 存储过程
实体框架允许您使用实体数据模型中的存储过程来代替或结合其自动命令生成。
-
您可以使用存储过程对数据库表执行预定义的逻辑,并且许多组织都制定了需要使用这些存储过程的策略。
-
它还可以指定 EF 应该使用您的存储过程来插入、更新或删除实体。
-
尽管动态构建的命令安全、高效,并且通常与您自己编写的命令一样好或更好,但在许多情况下,存储过程已经存在,并且您公司的做法可能会限制直接使用这些表。
-
或者,您可能只想明确控制在存储中执行的内容,而更喜欢创建存储过程。
以下示例从 File → New → Project 创建一个新项目。
步骤 1 – 从中间窗格中选择控制台应用程序,然后在名称字段中输入 StoredProceduresDemo。
步骤 2 – 在服务器资源管理器中右键单击您的数据库。
Step 3 – 选择 New Query 并在 T-SQL 编辑器中输入以下代码以在数据库中添加一个新表。
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[StudentGrade]( [EnrollmentID] [int] IDENTITY(1,1) NOT NULL, [CourseID] [int] NOT NULL, [StudentID] [int] NOT NULL, [Grade] [decimal](3, 2) NULL, CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED ( [EnrollmentID] ASC ) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO
步骤 4 – 右键单击编辑器并选择执行。
步骤 5 – 右键单击您的数据库,然后单击刷新。您将在数据库中看到新添加的表。
步骤 6 – 在服务器资源管理器中,再次右键单击您的数据库。
Step 7 – 选择 New Query 并在 T-SQL 编辑器中输入以下代码以在您的数据库中添加一个存储过程,这将返回学生成绩。
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[GetStudentGrades] @StudentID int AS SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade WHERE StudentID = @StudentID ' END GO
步骤 8 – 右键单击编辑器并选择执行。
步骤 9 – 右键单击您的数据库,然后单击刷新。您将看到在您的数据库中创建了一个存储过程。
步骤 10 – 在解决方案资源管理器中右键单击项目名称,然后选择添加 → 新项目。
步骤 11 – 然后在模板窗格中选择 ADO.NET 实体数据模型。
步骤 12 – 输入 SPModel 作为名称,然后单击添加。
步骤 13 – 在选择模型内容对话框中,从数据库中选择 EF 设计器,然后单击下一步。
步骤 14 – 选择您的数据库并单击下一步。
步骤 15 – 在“选择您的数据库对象”对话框中,单击表、视图。
步骤 16 – 选择位于存储过程和函数节点下的 GetStudentGradesForCourse 函数,然后单击完成。
步骤 17 – 选择查看 → 其他窗口 → 实体数据模型浏览器,然后右键单击函数导入下的 GetStudentGrades 并选择编辑。
它将产生以下对话框。
步骤 18 – 单击实体单选按钮并从组合框中选择 StudentGrade 作为此存储过程的返回类型,然后单击确定。
让我们看一下以下 C# 代码,其中将通过在 GetStudentGrades 存储过程中将学生 ID 作为参数传递来检索所有成绩。
class Program { static void Main(string[] args) { using (var context = new UniContextEntities()) { int studentID = 22; var studentGrades = context.GetStudentGrades(studentID); foreach (var student in studentGrades) { Console.WriteLine("Course ID: {0}, Title: {1}, Grade: {2} ", student.CourseID, student.Course.Title, student.Grade); } Console.ReadKey(); } } }
编译并执行上述代码后,您将收到以下输出 –
Course ID: 4022, Title: Microeconomics, Grade: 3.00 Course ID: 4041, Title: Macroeconomics, Grade: 3.50
我们建议您逐步执行上述示例,以便更好地理解。