共用方式為


設計工具 查詢存放區 程式

這個逐步解說示範如何使用 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 ,然後按兩下 [ 新增]。

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

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

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

    匯入預存程式

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

  • 按一下完成

根據預設,傳回多個數據行之每個匯入預存程式或函式的結果圖形會自動成為新的複雜類型。 在此範例中,我們想要將 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 擷取數據以取得詳細數據。