共用方式為


逐步解說:自訂實體類別的插入、更新和刪除行為

物件關聯式設計工具 (O/R 設計工具) 提供視覺化設計介面,用以建立和編輯以資料庫物件為基礎的 LINQ to SQL 類別 (實體類別)。 透過 LINQ to SQL,您可以使用 LINQ 技術來存取 SQL 資料庫。 如需詳細資訊,請參閱LINQ (Language-Integrated Query)

執行更新的邏輯預設是由 LINQ to SQL 執行階段提供。 執行階段會根據資料表的結構描述 (資料行定義和主索引鍵資訊),建立預設的 Insert、Update 和 Delete 陳述式。 如果不想要使用預設行為,則可以設定更新行為,並指定用特定的預存程序 (Stored Procedure) 來執行處理資料庫資料時所需的插入、更新和刪除作業。 未產生預設行為時 (例如,實體類別是對應至檢視時),同樣可以這樣做。 此外,在資料庫需要透過預存程序進行資料表存取時,也可以覆寫預設更新行為。 如需詳細資訊,請參閱 使用預存程序自訂作業 (LINQ to SQL)

注意事項注意事項

這個逐步解說需要使用 Northwind 資料庫中的 InsertCustomerUpdateCustomerDeleteCustomer 預存程序。 如需如何建立這些預存程序的詳細資訊,請參閱逐步解說:建立 Northwind Customers 資料表的更新預存程序

這個逐步解說提供覆寫預設 LINQ to SQL 執行階段行為,以使用預存程序將資料儲存回資料庫的必要步驟。

在此逐步解說中,您將學習如何執行下列工作:

  • 建立新的 Windows Form 應用程式,並在其中加入 LINQ to SQL 檔案。

  • 建立對應至 Northwind Customers 資料表的實體類別。

  • 建立參考 LINQ to SQL Customer 類別的物件資料來源。

  • 建立 Windows Form,這個 Windows Form 包含繫結至 Customer 類別的 DataGridView

  • 實作表單的儲存功能。

  • 將預存程序加入至 O/R 設計工具以建立 DataContext 方法。

  • 設定 Customer 類別,以使用預存程序來執行插入、更新和刪除作業。

必要條件

若要完成這個逐步解說,您需要下列項目:

建立應用程式和加入 LINQ to SQL 類別

因為您會使用 LINQ to SQL 類別並將資料顯示在 Windows Form 上,所以請建立新的 Windows Form 應用程式並加入 LINQ to SQL 類別檔案。

注意事項注意事項

您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱 Visual Studio 設定

若要建立內含 LINQ to SQL 類別的新 Windows 應用程式專案

  1. 從 [檔案] 功能表中,建立新專案。

  2. 將專案命名為 UpdatingwithSProcsWalkthrough。

    注意事項注意事項

    Visual Basic 和 C# 專案都支援 O/R 設計工具。 因此請以其中一種語言建立新專案。

  3. 按一下 [Windows Form 應用程式] 範本,然後按一下 [確定]。 如需詳細資訊,請參閱建立 Windows 架構的應用程式

    UpdatingwithSProcsWalkthrough 專案已建立並加入至 [方案總管] 中。

  4. 按一下 [專案] 功能表上的 [加入新項目]。

  5. 按一下 [LINQ to SQL 類別] 範本,並在 [名稱] 方塊中輸入 Northwind.dbml。

  6. 按一下 [加入]。

    專案中隨即加入空的 LINQ to SQL 類別檔案 (Northwind.dbml),並開啟 O/R 設計工具。

建立 Customer 實體類別和物件資料來源

將資料表從 [伺服器總管]/[資料庫總管] 拖曳至 O/R 設計工具,就可以建立對應至資料庫資料表的 LINQ to SQL 類別。 結果會產生對應至資料庫中各資料表的 LINQ to SQL 實體類別。 建立實體類別之後,實體類別就和其他具有公用 (Public) 屬性的類別一樣,可以當成物件資料來源使用。

若要建立 Customer 實體類別和將它設為資料來源

  1. 在 [伺服器總管]/[資料庫總管] 中,於 SQL Server 版的 Northwind 範例資料庫中尋找 Customer 資料表。 如需詳細資訊,請參閱 HOW TO:建立與 Northwind 資料庫的資料連線

  2. 將 [Customers] 節點從 [伺服器總管]/[資料庫總管] 拖曳至 O/R 設計工具介面。

    建立一個名稱為 Customer 的實體類別。 它的屬性會對應至 Customers 資料表中的各資料行。 因為這個實體類別代表 Customers 資料表中的單一客戶,所以它的名稱是 Customer,而不是 Customers

    注意事項注意事項

    這個重新命名的行為稱為「複數表示」(Pluralization)。 您可以在選項對話方塊 (Visual Studio) 中開啟或關閉這個行為。 如需詳細資訊,請參閱 HOW TO:開啟和關閉複數表示 (O/R 設計工具)

  3. 按一下 [建置] 功能表上的 [建置 UpdatingwithSProcsWalkthrough] 進行專案建置。

  4. 在 [資料] 功能表上,按一下 [顯示資料來源]。

  5. 在 [資料來源] 視窗中,按一下 [加入新資料來源]。

  6. 按一下 [選擇資料來源類型] 頁面上的 [物件],然後按 [下一步]。

  7. 展開 [UpdatingwithSProcsWalkthrough] 節點,然後尋找並選取 [Customer] 類別。

    注意事項注意事項

    如果 Customer 類別無法使用,請取消精靈、建置專案,然後再次執行精靈。

  8. 按一下 [完成] 以建立資料來源,然後將 [Customer] 實體類別加入至 [資料來源] 視窗。

建立 DataGridView 以便在 Windows Form 上顯示 Customer 資料

將 LINQ to SQL 資料來源項目從 [資料來源] 視窗拖曳至 Windows Form,就可以建立繫結至實體類別的控制項。

若要加入繫結至實體類別的控制項

  1. 在 [設計] 檢視表中開啟 [Form1]。

  2. 從 [資料來源] 視窗將 [Customer] 節點拖曳至 Form1。

    注意事項注意事項

    若要顯示 [資料來源] 視窗,請按一下 [資料] 功能表上的 [顯示資料來源]。

  3. 在 [程式碼編輯器] 中開啟 Form1。

  4. 將下列程式碼加入至表單的全域範圍中,意即不要指定特定的方法,但要屬於 Form1 類別的一部分:

    Private NorthwindDataContext1 As New NorthwindDataContext
    
    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. 建立 Form_Load 事件的事件處理常式,並將下列程式碼加入至處理常式中:

    CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
    
    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

實作儲存功能

預設不會啟用儲存按鈕,也不會實作儲存功能。 同時,為物件資料來源建立資料繫結控制項時,並不會自動加入程式碼以將變更的資料儲存至資料庫。 本節說明如何啟用儲存按鈕並實作 LINQ to SQL 物件的儲存功能。

若要實作儲存功能

  1. 在 [設計] 檢視表中開啟 [Form1]。

  2. 選取 [CustomerBindingNavigator] 上的儲存按鈕 (圖示為磁碟片的按鈕)。

  3. 在 [屬性] 視窗中,將 [Enabled] 屬性設定為 True

  4. 按兩下儲存按鈕以建立事件處理常式,並切換至 [色彩編輯器]。

  5. 將下列程式碼加入至儲存按鈕事件處理常式:

    NorthwindDataContext1.SubmitChanges()
    
    northwindDataContext1.SubmitChanges();
    

覆寫執行更新 (插入、更新和刪除) 的預設行為

若要覆寫預設更新行為

  1. 在 O/R 設計工具中開啟 LINQ to SQL 檔案 (按兩下 [方案總管] 中的 [Northwind.dbml] 檔案)。

  2. 在 [伺服器總管]/[資料庫總管] 中展開 Northwind 資料庫的 [預存程序] 節點,找到 [InsertCustomers]、[UpdateCustomers] 和 [DeleteCustomers] 預存程序。

  3. 將這三個預存程序都拖曳至 O/R 設計工具。

    預存程序會加入至方法窗格中做為 DataContext 方法。 如需詳細資訊,請參閱 DataContext 方法 (O/R 設計工具)

  4. 選取 O/R 設計工具中的 [Customer] 實體類別。

  5. 選取 [屬性] 視窗中的 [Insert] 屬性。

  6. 按一下省略符號 (...)(在 [使用執行階段] 旁邊) 以開啟 [設定行為] 對話方塊。

  7. 選取 [自訂]。

  8. 選取 [自訂] 清單中的 [InsertCustomers] 方法。

  9. 按一下 [套用] 儲存所選取類別和行為的設定。

    注意事項注意事項

    完成每一項變更後按一下 [套用],即可繼續設定每個類別/行為組合的行為。 如果您在按一下 [套用] 之前變更了類別或行為,則會出現警告對話方塊,讓您可以套用任何變更。

  10. 選取 [行為] 清單中的 [更新]。

  11. 選取 [自訂]。

  12. 選取 [自訂] 清單中的 [UpdateCustomers] 方法。

    檢查 [方法引數] 和 [類別屬性] 清單會發現資料表的某些資料行有兩個 [方法引數] 和兩個 [類別屬性]。 這樣可以更容易追蹤變更,並建立陳述式來檢查並行違規。

  13. 將 [Original_CustomerID] 方法引數對應至 [CustomerID (Original)] 類別屬性。

    注意事項注意事項

    根據預設,方法引數會對應至同名的類別屬性。 如果屬性名稱變更,使得資料表與實體類別之間不再對應,則您可能需要選取當 O/R 設計工具無法判斷正確的對應時,所要對應的對等類別屬性。 此外,如果方法引數沒有可對應的有效類別屬性,可以將 [類別屬性] 值設定為 [(無)]。

  14. 按一下 [套用] 儲存所選取類別和行為的設定。

  15. 選取 [行為] 清單中的 [刪除]。

  16. 選取 [自訂]。

  17. 選取 [自訂] 清單中的 [DeleteCustomers] 方法。

  18. 將 [Original_CustomerID] 方法引數對應至 [CustomerID (Original)] 類別屬性。

  19. 按一下 [確定]。

注意事項注意事項

雖然這在本特定逐步解說中不會構成問題,仍不建議 LINQ to SQL 在插入和更新期間,針對識別 (自動遞增)、rowguidcol (資料庫產生的 GUID) 和時間戳記資料行自動處理資料庫產生的值。 其他資料行型別的資料庫產生值將產生非預期的 null 值。 若要傳回資料庫產生的值,您應該手動將 IsDbGenerated 設定為 true,並將 AutoSync 設定為下列其中一項:AlwaysOnInsertOnUpdate

測試應用程式

再次執行應用程式,確認 UpdateCustomers 預存程序已正確更新資料庫中的客戶記錄。

若要測試應用程式

  1. 按下 F5 鍵。

  2. 修改方格內的記錄,以測試「更新」行為。

  3. 加入新的記錄,以測試「插入」行為。

  4. 按一下儲存按鈕,將變更儲存回資料庫。

  5. 關閉表單。

  6. 按 F5,確認更新的記錄和剛插入的記錄確實存在。

  7. 刪除您在步驟 3 建立的新記錄,以測試「刪除」行為。

  8. 按一下儲存按鈕送出變更並從資料庫中移除刪除的記錄

  9. 關閉表單。

  10. 按 F5 並確認已從資料庫中移除刪除的記錄。

    注意事項注意事項

    如果應用程式使用 SQL Server Express Edition,則根據資料庫檔案 [複製到輸出目錄] 屬性值的不同,在步驟 10 按 F5 時,變更可能不會出現。 如需詳細資訊,請參閱 HOW TO:管理專案中的本機資料檔

後續步驟

根據應用程式需求的不同,在建立 LINQ to SQL 實體類別之後,您可能會想執行幾個步驟。 您可以進行下列作業讓這個應用程式發揮更強的功能:

請參閱

工作

HOW TO:指派預存程序來執行更新、插入和刪除 (O/R 設計工具)

概念

LINQ to SQL 查詢

DataContext 方法 (O/R 設計工具)

資料應用程式開發的新功能

其他資源

物件關聯式設計工具 (O/R 設計工具)

LINQ to SQL