实体框架 - 存储过程
实体框架允许您在实体数据模型中使用存储过程,而不是其自动命令生成,或与其结合使用。
您可以使用存储过程对数据库表执行预定义逻辑,许多组织都制定了要求使用这些存储过程的策略。
它还可以指定 EF 应使用您的存储过程来插入、更新或删除实体。
尽管动态构建的命令是安全、高效的,并且通常与您自己编写的命令一样好或更好,但在许多情况下,存储过程已经存在,并且您的公司惯例可能会限制直接使用表。
或者,您可能只想明确控制在存储上执行的内容,并倾向于创建存储过程。
以下示例从中创建一个新项目 File → New → Project。
步骤 1 − 从中间窗格中选择控制台应用程序,并在名称字段中输入 StoredProceduresDemo。
步骤 2 − 在服务器资源管理器中右键单击您的数据库。
步骤 3 − 选择新建查询并在 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 − 在服务器资源管理器中,再次右键单击数据库。
步骤 7 − 选择"新建查询",然后在 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
我们建议您逐步执行上述示例,以便更好地理解。