實體框架 - 儲存過程



實體框架允許您在實體資料模型中使用儲存過程,而不是或與它的自動命令生成結合使用。

  • 您可以使用儲存過程對資料庫表執行預定義的邏輯,許多組織都有強制使用這些儲存過程的策略。

  • 它還可以指定 EF 應該使用您的儲存過程來插入、更新或刪除實體。

  • 雖然動態生成的命令安全、高效,並且通常與您自己編寫的命令一樣好或更好,但在許多情況下,儲存過程已經存在,並且貴公司的實踐可能會限制直接使用表。

  • 或者,您可能只想對儲存中執行的操作進行顯式控制,並更傾向於建立儲存過程。

以下示例從“檔案”→“新建”→“專案”建立新專案。

Procedure 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 - 右鍵單擊編輯器並選擇“執行”。

Editor

步驟 5 - 右鍵單擊您的資料庫並單擊“重新整理”。您將在資料庫中看到新新增的表。

步驟 6 - 在伺服器資源管理器中,再次右鍵單擊您的資料庫。

Server Database

步驟 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 - 右鍵單擊編輯器並選擇“執行”。

Execute

步驟 9 - 右鍵單擊您的資料庫並單擊“重新整理”。您將看到在資料庫中建立了一個儲存過程。

Store Procedure Created

步驟 10 - 在解決方案資源管理器中右鍵單擊專案名稱,然後選擇“新增”→“新建項”。

步驟 11 - 然後在“模板”窗格中選擇“ADO.NET 實體資料模型”。

Template Pane

步驟 12 - 輸入 SPModel 作為名稱,然後單擊“新增”。

步驟 13 - 在“選擇模型內容”對話方塊中,選擇“從資料庫中選擇 EF 設計器”,然後單擊“下一步”。

Model Contents

步驟 14 - 選擇您的資料庫並單擊“下一步”。

Database 1

步驟 15 - 在“選擇資料庫物件”對話方塊中,單擊表、檢視。

Database Objects

步驟 16 - 選擇位於“儲存過程和函式”節點下的 GetStudentGradesForCourse 函式,然後單擊“完成”。

步驟 17 - 選擇“檢視”→“其他視窗”→“實體資料模型瀏覽器”,右鍵單擊“函式匯入”下的 GetStudentGrades 並選擇“編輯”。

Entity Browser

它將生成以下對話方塊。

Entity Browser Dialog

步驟 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

我們建議您逐步執行上述示例,以便更好地理解。

廣告
© . All rights reserved.