实体框架允许您使用实体数据模型中的存储过程,而不是其自动命令生成或与其结合使用.
您可以使用存储过程在数据库表上执行预定义逻辑,并且许多组织都制定了需要使用这些存储过程的策略.
它还可以指定EF应该使用存储过程来插入,更新或删除实体.
尽管动态构建的命令是安全,高效的,并且通常与您自己编写的那些一样好或更好,有很多情况下存储过程已存在,您的公司实践可能会限制直接使用表格.
或者,您可能只想明确控制商店上执行的内容,而更喜欢创建存储过程.
以下示例创建一个新项目来自文件→新建→项目.
第1步 : 从中间窗格中选择控制台应用程序,然后在名称字段中输入StoredProceduresDemo.
步骤2 : 在Server explorer中,右键单击您的数据库.
步骤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 : 在Server explorer中,再次右键单击数据库.
第7步 : 选择New Query并在T-SQL编辑器中输入以下代码,在数据库中添加一个存储过程,该过程将返回Student成绩.
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 designer",然后单击"下一步".
第14步 : 选择你的数据库并单击Next.
第15步 : 在"选择数据库对象"对话框中,单击表,视图.
步骤16 : 选择存储过程和函数节点下的GetStudentGradesForCourse函数,然后单击Finish.
步骤17 : 选择View→Other Windows→Entity Data Model Browser,右键单击Function Imports下的GetStudentGrades,然后选择Edit.
它将生成以下对话框.
第18步 : 单击Entities单选按钮,从组合框中选择StudentGrade作为此存储过程的返回类型,然后单击Ok.
让我们看看下面的C#代码,其中将检索所有成绩通过将学生ID作为GetStudentGrades存储过程中的参数传递.
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
我们建议您逐步执行上述示例,以便更好地理解.