逐步解說:建立 LINQ to SQL 類別 (O/R 設計工具)

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

這個逐步解說提供建立與 Northwind 資料庫的 Customers 和 Orders 資料表對應的 LINQ to SQL 實體類別,並將資料顯示在 Windows Form 上的必要步驟。除了提供如何顯示資料表資料的步驟之外,也提供將資料繫結至 LINQ 查詢的步驟。最後還會提供使用預存程序 (Stored Procedure) 取代預設 LINQ to SQL 邏輯,以將實體類別的更新傳送至資料庫的步驟。

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

  • 將 LINQ to SQL 檔案加入至專案。

  • 建立新的實體類別,這個實體類別對應至資料庫中的相關資料表。

  • 建立參考這個實體類別的物件資料來源。

  • 建立 Windows Form,這個 Windows Form 包含繫結至實體類別的控制項。

  • 加入程式碼,以載入和儲存實體類別與資料庫之間的資料。

  • 建構簡單 LINQ 查詢,並將結果顯示在表單上。

  • 將預存程序加入至 O/R 設計工具。

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

必要條件

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

建立 Windows 應用程式

因為您會使用 LINQ to SQL 類別並將資料顯示在 Windows Form 上,所以本逐步解說的第一個步驟就是建立一個新的 Windows Form 應用程式。

注意事項注意事項

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

若要建立新的 Windows 應用程式專案

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

  2. 將專案命名為 ORDesignerWalkthrough。

    注意事項注意事項

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

  3. 按一下 [Windows Form 應用程式] 範本,然後按一下 [確定]。如需詳細資訊,請參閱使用 .NET Framework 開發用戶端應用程式

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

將 LINQ to SQL 類別檔案加入至專案 (開啟 O/R Designer)

實體類別已建立並儲存在 LINQ to SQL 類別檔案 (.dbml 檔案) 中。當您開啟 .dbml 檔時 O/R 設計工具 也會開啟。在 [加入新項目] 對話方塊中選取 [LINQ to SQL 類別] 範本以新增 .dbml 檔至專案。

若要將 .dbml 檔案加入至專案

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

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

  3. 按一下 [加入]。

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

將新的 LINQ to SQL 檔案加入至專案之後,顯示兩個不同窗格的空設計介面隨即開啟。左窗格是顯示和設定實體類別的實體窗格。右窗格是方法窗格,會顯示加入至設計工具的 DataContext 方法。如果看不到方法窗格,請以滑鼠右鍵按一下實體窗格的空白區域,然後按一下 [顯示方法窗格]。整個空介面代表一個已可設定的 DataContextDataContext 名稱會對應至您提供的 .dbml 檔案名稱。在這個逐步解說中,因為已將 LINQ to SQL 檔案命名為 Northwind.dbml,所以會將 DataContext 命名為 NorthwindDataContext。您可以按一下設計工具的任何空白區域,然後檢查 [屬性] 視窗來做確認。

注意事項注意事項

DataContext 類別包含的方法和屬性,可以用來連接至資料庫以及管理資料庫中的資料 (例如,執行插入、更新和刪除作業)。如需詳細資訊,請參閱 DataContext 方法 (O/R 設計工具)

建立 Customer 和 Order 實體類別

將資料表從 [伺服器總管]/[資料庫總管] 拖曳至 O/R 設計工具,就可以建立對應至資料庫資料表的 LINQ to SQL 類別。結果會產生對應至資料庫資料表的 LINQ to SQL 實體類別。

若要將 Customer 實體類別加入至 O/R Designer

  1. 在 [伺服器總管]/[資料庫總管] 中,於 SQL Server 版的 Northwind 範例資料庫中尋找資料表。如需詳細資訊,請參閱 如何:連接到 Northwind 資料庫

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

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

    注意事項注意事項

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

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

    會建立實體類別 Order,以及與 Customer 實體類別的 Customer_Order 關聯 (關聯性)。它的屬性會對應至 Orders 資料表中的各資料行。

    注意事項注意事項

    因為這個實體類別代表單一訂單,所以它的名稱是 Order。父類別 (Customer) 的 Orders 屬性代表該特定客戶的一組訂單。如需 LINQ to SQL 關聯的詳細資訊,請參閱 HOW TO:在 LINQ to SQL 類別之間建立關聯 (關聯性) (O/R 設計工具)

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

實體類別就和其他具有公用 (Public) 屬性的類別一樣,都可以當成物件資料來源使用。您可以將它們加入至 [資料來源] 視窗並拖曳至表單,以建立資料繫結控制項 (繫結至物件公用屬性值的控制項)。執行 [資料來源組態精靈],然後在精靈中按一下資料來源的 [物件],就可以將實體類別加入至 [資料來源] 視窗。

若要在資料來源視窗中加入 Customer 做為物件資料來源

  1. 按一下 [建置] 功能表上的 [建置 ORDesignerWalkthrough],進行專案建置。

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

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

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

  5. 展開 [ORDesignerWalkthrough] 節點 (具有您專案名稱的節點),然後找出並選取 [Customer] 類別。

    注意事項注意事項

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

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

建立資料繫結控制項以將資料顯示在 Windows Form 上

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

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

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

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

    注意事項注意事項

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

  3. 從 [資料來源] 視窗,將 [Orders] 節點拖曳至 [Form1],並將它放到 [CustomerDataGridView] 底下。

  4. 以程式碼檢視開啟 [Form1]。

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

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

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

測試應用程式

執行應用程式。現在,表單中有一個 DataGridView 會顯示 Customers 資料表中的資料,並有另一個 DataGridView 會顯示所選取客戶的訂單資料。

注意事項注意事項

請注意,儲存按鈕已停用 (在下一節中,會實作儲存功能)。

若要測試應用程式

  1. 按下 F5 鍵。

  2. 確認資料確實出現在資料方格中。

  3. 選取客戶。

  4. 確認顯示的訂單是所選取客戶的訂單。

  5. 關閉表單。(按一下 [偵錯] 功能表上的 [停止偵錯])。

實作儲存功能

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

若要實作儲存功能

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

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

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

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

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

    Try
        NorthwindDataContext1.SubmitChanges()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    
    try
    {
        northwindDataContext1.SubmitChanges();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    

測試應用程式

執行應用程式。此時,儲存按鈕應為啟用狀態,而且也可以使用儲存資料的功能。

若要測試應用程式

  1. 按下 F5 鍵。

  2. 修改任一方格中的一些資料 (編輯資料列後,移到方格內的其他地方,即可認可同處理序 (In-Process) 變更)。

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

  4. 關閉表單

  5. 按 F5 並確認變更已保存 (或尋找資料庫中的資料表,確認變更已儲存)。

繫結至 LINQ 查詢

除了將 CustomerBindingSource 繫結至 DataContext 以外,您還可以直接繫結至 LINQ 查詢。如需如何建立 LINQ 查詢的詳細資訊,請參閱 LINQ 查詢簡介 (C#)

Bb384428.collapse_all(zh-tw,VS.140).gif將 Button 和 TextBox 加入至表單

若要了解如何將控制項繫結至 LINQ 查詢,請在表單中加入可讓您輸入查詢參數並且執行查詢的控制項。

若要將控制項加入至表單

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

  2. 將 [TextBox] 加入至表單,並將它的 [Name] 屬性設為 [CityTextBox]。

  3. 將 [Button] 加入至表單,並設定下列屬性:

    • Name = RunQueryButton

    • Text = Run Query

Bb384428.collapse_all(zh-tw,VS.140).gif資料繫結至 LINQ 查詢

加入程式碼,以執行 LINQ 查詢。這個查詢會使用輸入至 CityTextBox 中的值做為查詢參數。

若要繫結至 LINQ 查詢

  • 按兩下 [RunQueryButton],並將下列程式碼加入至 RunQueryButton_click 事件處理常式:

    Dim CustomersQuery = From customers in NorthwindDataContext1.Customers _
        Where customers.City = CityTextBox.Text _
        Select customers
    
    CustomerBindingSource.DataSource = CustomersQuery
    
    var CustomersQuery = from customers in northwindDataContext1.Customers
                          where customers.City == CityTextBox.Text
                          select customers;
    
    customerBindingSource.DataSource = CustomersQuery;
    

測試應用程式

執行應用程式。您現在可以查詢位在特定城市中的客戶。

若要測試應用程式

  1. 按下 F5 鍵。

  2. 在文字方塊中輸入 London。

  3. 按一下 [執行查詢] 按鈕。

  4. 確認只顯示 [City] 屬性為 [London] 的客戶。

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

根據預設,執行更新的邏輯是由 LINQ to SQL 執行階段所提供。執行階段會建立以 Select 陳述式為依據的預設 Insert、Update 及 Delete 陳述式,Select 陳述式用於將資料填入實體類別。如果不想要使用這個預設行為,則可以設定更新行為,並指定特定的預存程序來執行管理資料庫資料所需的插入、更新和刪除作業。未產生預設行為時 (例如,實體類別是對應至聯結的資料表時),同樣可以這樣做。此外,在資料庫需要透過預存程序進行資料表存取時,也可以覆寫預設更新行為。

注意事項注意事項

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

若要覆寫預設更新行為

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

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

  3. 將 [UpdateCustomers] 預存程序拖曳至 O/R 設計工具。

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

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

  5. 在 [屬性] 視窗中,選取要覆寫的命令 ([Insert]、[Update] 或 [Delete])。在這個範例中,是選取 [Update] 屬性。

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

  7. 選取 [自訂]。

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

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

  10. 將原始方法引數 (Original_ArgumentName) 對應至原始屬性 (PropertyName (Original))。在這個逐步解說中,必須將 [Original_CustomerID] 引數對應至 [CustomerID (Original)] 屬性。

    注意事項注意事項

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

  11. 按一下 [確定]。

測試應用程式

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

若要測試應用程式

  1. 按下 F5 鍵。

  2. 在方格中的 [ContactName] 資料行中尋找 [ALFKI]。

  3. 將名稱從 [Maria Anders] 變更為 Anders。

  4. 移離資料列,以認可變更。

  5. 按一下儲存按鈕。

  6. 關閉表單

  7. 按 F5 再次執行應用程式,並確認 [ALFKI] 的 [ContactName] 資料行中只出現 Anders。

後續步驟

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

請參閱

概念

O/R 設計工具概觀

其他資源

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

LINQ to SQL [LINQ to SQL]

LINQ General Programming Guide

LINQ to ADO.NET

LINQ Documentation Roadmap

Visual Studio 2012 中資料應用程式開發的新功能

存取 Visual Studio 中的資料