Entity Framework - 存储过程

实体框架允许您使用实体数据模型中的存储过程,而不是其自动命令生成或与其结合使用.

  • 您可以使用存储过程在数据库表上执行预定义逻辑,并且许多组织都制定了需要使用这些存储过程的策略.

  • 它还可以指定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步 : 右键单击编辑器并选择执行.

Editor

第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.

Database 1

第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


我们建议您逐步执行上述示例,以便更好地理解.