消費者入門 Entity Framework 4.0 Database First 和 ASP.NET 4 Web Form - 第 7 部分

作者 :Tom Dykstra

Contoso University 範例 Web 應用程式示範如何使用 Entity Framework 4.0 和 Visual Studio 2010 建立 ASP.NET Web Forms應用程式。 如需教學課程系列的相關資訊,請參閱系列中的第一個教學課程

使用預存程序

在上一個教學課程中,您已實作每個階層的資料表繼承模式。 本教學課程將示範如何使用預存程式,更充分掌控資料庫存取。

Entity Framework 可讓您指定它應該使用預存程式進行資料庫存取。 對於任何實體類型,您可以指定要用於建立、更新或刪除該類型實體的預存程式。 然後在資料模型中,您可以新增預存程式的參考,以便用來執行工作,例如擷取實體集。

使用預存程式是資料庫存取的常見需求。 在某些情況下,資料庫管理員可能會基於安全性考慮,要求所有資料庫存取都經過預存程式。 在其他情況下,您可能想要將商務邏輯建置到 Entity Framework 在更新資料庫時所使用的一些程式。 例如,每當刪除實體時,您可能會想要將它複製到封存資料庫。 或者,每當更新資料列時,您可能會想要將資料列寫入記錄誰進行變更的記錄資料表。 您可以在每當 Entity Framework 刪除實體或更新實體時呼叫的預存程式中執行這類工作。

如同上一個教學課程,您將不會建立任何新頁面。 相反地,您將變更 Entity Framework 存取資料庫的方式,以取得您已建立的部分頁面。

在本教學課程中,您將在資料庫中建立預存程式來插入 StudentInstructor 實體。 您會將它們新增至資料模型,並指定 Entity Framework 應該使用它們將 和 Instructor 實體新增 Student 至資料庫。 您也會建立可用來擷取 Course 實體的預存程式。

在資料庫中建立預存程式

(如果您使用本教學課程中可供下載之專案的 School.mdf 檔案,您可以略過本節,因為預存程式已經存在。)

[伺服器總管] 中,展開 [School.mdf],以滑鼠右鍵按一下 [預存程式],然後選取 [ 新增預存程式]。

image15

複製下列 SQL 語句,並將其貼到預存程式視窗中,取代基本架構預存程式。

CREATE PROCEDURE [dbo].[InsertStudent]
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                EnrollmentDate)
    VALUES (@LastName, 
        @FirstName, 
        @EnrollmentDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

image14

Student 實體有四個屬性: PersonIDLastNameFirstNameEnrollmentDate 。 資料庫會自動產生識別碼值,而預存程式會接受其他三個參數。 預存程式會傳回新資料列記錄索引鍵的值,讓 Entity Framework 可以追蹤其保留在記憶體中的實體版本中。

儲存並關閉預存程式視窗。

使用下列 SQL 語句,以相同方式建立 InsertInstructor 預存程式:

CREATE PROCEDURE [dbo].[InsertInstructor]
        @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    INSERT INTO dbo.Person (LastName, 
                FirstName, 
                HireDate)
    VALUES (@LastName, 
        @FirstName, 
        @HireDate);
    SELECT SCOPE_IDENTITY() as NewPersonID;

Update同時建立 和 Instructor 實體的 Student 預存程式。 (資料庫已經有 DeletePerson 適用于 和 Student entities 的預存程式 Instructor 。)

CREATE PROCEDURE [dbo].[UpdateStudent]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @EnrollmentDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            EnrollmentDate=@EnrollmentDate
    WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
    @PersonID int,
    @LastName nvarchar(50),
    @FirstName nvarchar(50),
    @HireDate datetime
    AS
    UPDATE Person SET LastName=@LastName, 
            FirstName=@FirstName,
            HireDate=@HireDate
    WHERE PersonID=@PersonID;

在本教學課程中,您將對應每個實體類型的三個函式 -- 插入、更新和刪除。 Entity Framework 第 4 版可讓您只將其中一或兩個函式對應至預存程式,而不對應其他函式,但有一個例外狀況:如果您對應更新函式,但不是 delete 函式,Entity Framework 會在您嘗試刪除實體時擲回例外狀況。 在 Entity Framework 3.5 版中,您沒有對應預存程式的彈性:如果您對應一個函式,則需要對應這三個函式。

若要建立可讀取而非更新資料的預存程式,請使用下列 SQL 語句建立選取所有 Course 實體的預存程式:

CREATE PROCEDURE [dbo].[GetCourses]
            AS
            SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course

將預存程式新增至資料模型

預存程式現在已定義于資料庫中,但它們必須新增至資料模型,才能提供給 Entity Framework 使用。 開啟 SchoolModel.edmx,以滑鼠右鍵按一下設計介面,然後 從資料庫選取 [更新模型]。 在 [選擇您的資料庫物件] 對話方塊的 [新增] 索引標籤中,展開 [預存程式],選取新建立的預存程式和 DeletePerson 預存程式,然後按一下 [完成]。

image20

對應預存程式

在資料模型設計工具中,以滑鼠右鍵按一下 Student 實體,然後選取 [預存程式對應]。

image21

[ 對應詳細資料 ] 視窗隨即出現,您可以在其中指定 Entity Framework 應該用於插入、更新和刪除此類型實體的預存程式。

image22

Insert 函式設定為 InsertStudent。 視窗會顯示預存程式參數的清單,每個參數都必須對應至實體屬性。 其中兩個會自動對應,因為名稱相同。 沒有名為 FirstName 的實體屬性,因此您必須從顯示可用實體屬性的下拉式清單中手動選取 FirstMidName 。 (這是因為您在第一個 tutorial.) 中將 FirstName 屬性的名稱變更為 FirstMidName

影像23

在相同的 [對應詳細資料] 視窗中,將 Update 函式對應至 UpdateStudent 預存程式, (確定您指定為 的參數值 FirstName ,如同您在 Insert 預存程式) 和 Delete 將函式指定 FirstMidNameDeletePerson 預存程式。

image01

請遵循相同的程式,將講師的插入、更新和刪除預存程式對應至 Instructor 實體。

image02

對於讀取而非更新資料的預存程式,您可以使用 [模型瀏覽器 ] 視窗,將預存程式對應至所傳回的實體類型。 在資料模型設計工具中,以滑鼠右鍵按一下設計介面,然後選取 [模型瀏覽器]。 開啟 [SchoolModel.Store] 節點,然後開啟 [ 預存程式] 節點。 然後以 GetCourses 滑鼠右鍵按一下預存程式,然後選取 [ 新增函數匯入]。

影像24

在 [新增函數匯入] 對話方塊的 [傳回選取實體的集合] 底下,然後選取Course 作為傳回的實體類型。 完成後,請按一下 [確定]。 儲存並關閉 .edmx 檔案。

image25

使用插入、更新和刪除預存程式

當您將預存程式新增至資料模型,並將其對應至適當的實體之後,Entity Framework 會自動使用這些預存程式來插入、更新和刪除資料。 您現在可以執行 StudentsAdd.aspx 頁面,而且每次建立新學生時,Entity Framework 都會使用 InsertStudent 預存程式將新資料列新增至 Student 資料表。

image03

執行 Students.aspx 頁面,新的學生會出現在清單中。

image04

變更名稱以確認更新函式可運作,然後刪除學生以確認刪除函式是否正常運作。

image05

使用選取預存程式

Entity Framework 不會自動執行預存程式,例如 GetCourses ,而且您無法將它們與 控制項搭配 EntityDataSource 使用。 若要使用它們,您可以從程式碼呼叫它們。

開啟 InstructorsCourses.aspx.cs 檔案。 方法 PopulateDropDownLists 會使用 LINQ-to-Entities 查詢來擷取所有課程實體,使其可以迴圈查看清單,並判斷講師指派給哪些課程實體,以及未指派的實體:

var allCourses = (from c in context.Courses
                  select c).ToList();

將此值取代為下列程式碼:

var allCourses = context.GetCourses();

頁面現在會 GetCourses 使用預存程式來擷取所有課程的清單。 執行頁面以確認其運作方式與之前一樣。

(預存程式所擷取之實體的導覽屬性可能不會根據 ObjectContext 預設設定自動填入與這些實體相關的資料。如需詳細資訊,請參閱 MSDN Library.) 載入相關物件

在下一個教學課程中,您將瞭解如何使用動態資料功能,更輕鬆地撰寫及測試資料格式設定和驗證規則。 您可以在資料模型中繼資料中指定這類規則,而不是在每個網頁規則上指定,例如資料格式字串,以及是否需要欄位,而是在每個頁面上自動套用這些規則。