設計工具查詢存放區程式

這個逐步解說示範如何使用 Entity Framework Designer (EF Designer) 將預存程式匯入模型,然後呼叫匯入的預存程式來擷取結果。

請注意,Code First 不支援對應至預存程式或函式。 不過,您可以使用 System.Data.Entity.DbSet.SqlQuery 方法呼叫預存程式或函式。 例如:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

必要條件

若要完成這個逐步解說,您將需要:

設定專案

  • 開啟 Visual Studio 2012。
  • 選取 [檔案- > 新增 - 專案] >
  • 在左窗格中,按一下 [Visual C# ],然後選取 主控台 範本。
  • 輸入 EFwithSProcsSample 作為名稱。
  • 選取 [確定]。

建立模型

  • 以滑鼠右鍵按一下方案總管中的專案,然後選取 [ 新增 - > 新增專案 ]。

  • 從左側功能表中選取 [資料 ],然後在 [範本] 窗格中選取 [ADO.NET 實體資料模型 ]。

  • 針對檔案名輸入 EFwithSProcsModel.edmx ,然後按一下 [ 新增 ]。

  • 在 [選擇模型內容] 對話方塊中,選取 [從資料庫 產生],然後按 [下一步 ]。

  • 按一下 [ 新增連線。
    在 [連線ion 屬性] 對話方塊中,輸入伺服器名稱 (例如 , localdb)\mssqllocaldb ),選取驗證方法,輸入 School 以取得資料庫名稱,然後按一下 [ 確定 ]。
    [選擇您的資料連線] 對話方塊會使用您的資料庫連線設定來更新。

  • 在 [選擇您的資料庫物件] 對話方塊中,核取 [ 資料表 ] 核取方塊以選取所有資料表。
    此外,請選取 [預存程式和函 式] 節點下的 下列預存程式: GetStudentGrades GetDepartmentName

    Import Stored Procedures

    從 Visual Studio 2012 開始,EF Designer 支援大量匯入預存程式。 預設會檢查將 選取的預存程式和函式匯入到entity 模型中

  • 按一下完成

根據預設,傳回多個資料行之每個匯入預存程式或函式的結果圖形會自動成為新的複雜類型。 在此範例中,我們想要將 GetStudentGrades 函式的結果 對應至 StudentGrade 實體,並將 GetDepartmentName 的結果 對應至 none 為預設值)。

若要讓函式匯入傳回實體類型,對應預存程式所傳回的資料行必須完全符合所傳回實體類型的純量屬性。 函式匯入也可以傳回簡單型別、複雜型別或無值的集合。

  • 以滑鼠右鍵按一下設計介面,然後選取 [模型瀏覽器 ]。
  • [模型瀏覽器] 中,選取 [ 函式匯入 ],然後按兩下 GetStudentGrades 函式。
  • 在 [編輯函數匯入] 對話方塊中,選取 [ 實體 ],然後選擇 [ StudentGrade ]。
    [函 式匯入] 對話方塊頂端的 [函式匯入可 撰寫] 核取方塊可讓您對應至可撰寫的函式。 如果您核取此方塊,則只有可組合函式 (資料表值函式) 會出現在 [預存程式/ 函式名稱 ] 下拉式清單中。 如果您未核取此方塊,清單中只會顯示無法撰寫的函式。

使用模型

開啟定義 Main 方法的 Program.cs 檔案。 將下列程式碼新增至 Main 函式。

程式碼會呼叫兩個預存程式: GetStudentGrades(傳回 指定 StudentId 的 StudentGrades )和 GetDepartmentName (傳回輸出參數中的部門名稱)。  

    using (SchoolEntities context = new SchoolEntities())
    {
        // Specify the Student ID.
        int studentId = 2;

        // Call GetStudentGrades and iterate through the returned collection.
        foreach (StudentGrade grade in context.GetStudentGrades(studentId))
        {
            Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
            Console.WriteLine("Student grade: " + grade.Grade);
        }

        // Call GetDepartmentName.
        // Declare the name variable that will contain the value returned by the output parameter.
        ObjectParameter name = new ObjectParameter("Name", typeof(String));
        context.GetDepartmentName(1, name);
        Console.WriteLine("The department name is {0}", name.Value);

    }

編譯並執行應用程式。 此程式會產生下列輸出:

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

輸出參數

如果使用輸出參數,則除非完整讀取結果,否則其值將無法使用。 這是因為 DbDataReader 的基礎行為,請參閱 使用 DataReader 擷取資料以取得詳細資料。