📜  Entity Framework-存储过程

📅  最后修改于: 2020-11-21 07:21:37             🧑  作者: Mango


实体框架允许您使用实体数据模型中的存储过程来代替其自动命令生成,或者与其结合使用。

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

  • 它还可以指定EF应该使用您的存储过程来插入,更新或删除实体。

  • 尽管动态构建的命令是安全,高效的,并且通常比您自己编写的命令好或更好,但是在许多情况下,存储过程已经存在,并且您的公司实践可能会限制直接使用表。

  • 另外,您可能只想对存储上执行的内容进行显式控制,而更喜欢创建存储过程。

以下示例从文件→新建→项目创建一个新项目。

程序新项目

步骤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-选择您的数据库,然后单击下一步。

数据库1

步骤15-在“选择数据库对象”对话框中,单击表,视图。

数据库对象

步骤16-选择位于“存储过程和函数”节点下的GetStudentGradesForCourse函数,然后单击“完成”。

步骤17-选择“视图”→“其他Windows”→“实体数据模型浏览器”,然后在“函数导入”下右键单击GetStudentGrades,然后选择“编辑”。

实体浏览器

它将产生以下对话框。

实体浏览器对话框

步骤18-单击实体单选按钮,然后从组合框中选择StudentGrade作为此存储过程的返回类型,然后单击确定。

让我们看一下下面的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

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