逐步解說:建立 LINQ to SQL 類別 (O/R 設計工具)
物件關聯式設計工具 (O/R 設計工具) 提供視覺化設計工具 (Visual Designer) ,用以建立和編輯以資料庫物件為基礎的 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 設計工具。
設定實體類別,以使用預存程序來執行插入、更新和刪除作業。
必要條件
若要完成這個逐步解說,您需要下列項目:
存取 SQL Server 版的 Northwind 範例資料庫。 如需詳細資訊,請參閱 HOW TO:安裝範例資料庫。
Northwind 資料庫的 UpdateCustomer 預存程序。 如需詳細資訊,請參閱逐步解說:建立 Northwind Customers 資料表的更新預存程序。
建立 Windows 應用程式
因為您會使用 LINQ to SQL 類別並將資料顯示在 Windows Form 上,所以本逐步解說的第一個步驟就是建立一個新的 Windows Form 應用程式。
注意事項 |
---|
您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱 Visual Studio 設定。 |
若要建立新的 Windows 應用程式專案
從 [檔案] 功能表中,建立新專案。
將專案命名為 ORDesignerWalkthrough。
注意事項 Visual Basic 和 C# 專案支援 O/R 設計工具,所以請以其中一種語言建立新專案。
按一下 [Windows Form 應用程式] 範本,然後按一下 [確定]。 如需詳細資訊,請參閱建立 Windows 架構的應用程式。
ORDesignerWalkthrough 專案已建立並加入至 [方案總管] 中。
將 LINQ to SQL 類別檔案加入至專案 (開啟 O/R Designer)
實體類別已建立並儲存在 LINQ to SQL 類別檔案 (.dbml 檔案) 中。 當您開啟 .dbml 檔時 O/R 設計工具 也會開啟。在 [加入新項目] 對話方塊中選取 [LINQ to SQL 類別] 範本以新增 .dbml 檔至專案。
若要將 .dbml 檔案加入至專案
按一下 [專案] 功能表上的 [加入新項目]。
按一下 [LINQ to SQL 類別] 範本,並在 [名稱] 方塊中輸入 Northwind.dbml。
按一下 [加入]。
專案中隨即加入空的 LINQ to SQL 類別檔案 (Northwind.dbml),並開啟 O/R 設計工具。
將新的 LINQ to SQL 檔案加入至專案之後,顯示兩個不同窗格的空設計介面隨即開啟。 左窗格是顯示和設定實體類別的實體窗格。 右窗格是方法窗格,會顯示加入至設計工具的 DataContext 方法。 如果看不到方法窗格,請以滑鼠右鍵按一下實體窗格的空白區域,然後按一下 [顯示方法窗格]。 整個空介面代表一個已可設定的 DataContext。 DataContext 名稱會對應至您提供的 .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
在 [伺服器總管]/[資料庫總管] 中,於 SQL Server 版的 Northwind 範例資料庫中尋找資料表。 如需詳細資訊,請參閱 HOW TO:建立與 Northwind 資料庫的資料連線。
將 [Customers] 節點從 [伺服器總管]/[資料庫總管] 拖曳至 O/R 設計工具介面。
建立一個名稱為 Customer 的實體類別。 它的屬性會對應至 Customers 資料表中的各資料行。 因為這個實體類別代表 Customers 資料表中的單一客戶,所以它的名稱是 Customer,而不是 Customers。
注意事項 這個重新命名的行為稱為「複數表示」(Pluralization)。 您可以在選項對話方塊 (Visual Studio) 中開啟或關閉這個行為。 如需詳細資訊,請參閱 HOW TO:開啟和關閉複數表示 (O/R 設計工具)。
將 [Orders] 節點從 [伺服器總管]/[資料庫總管] 拖曳至 O/R 設計工具介面。
會建立實體類別 Order,以及與 Customer 實體類別的 Customer_Order 關聯 (關聯性)。 它的屬性會對應至 Orders 資料表中的各資料行。
注意事項 因為這個實體類別代表單一訂單,所以它的名稱是 Order。 父類別 (Customer) 的 Orders 屬性代表該特定客戶的一組訂單。 如需 LINQ to SQL 關聯的詳細資訊,請參閱 HOW TO:在 LINQ to SQL 類別之間建立關聯 (關聯性) (O/R 設計工具)。
使用 Customer 實體類別建立物件資料來源
實體類別就和其他具有公用 (Public) 屬性的類別一樣,都可以當成物件資料來源使用。 您可以將它們加入至 [資料來源] 視窗並拖曳至表單,以建立資料繫結控制項 (繫結至物件公用屬性值的控制項)。 執行 [資料來源組態精靈],然後在精靈中按一下資料來源的 [物件],就可以將實體類別加入至 [資料來源] 視窗。
若要在資料來源視窗中加入 Customer 做為物件資料來源
按一下 [建置] 功能表上的 [建置 ORDesignerWalkthrough],進行專案建置。
在 [資料] 功能表上,按一下 [顯示資料來源]。
在 [資料來源] 視窗中,按一下 [加入新資料來源]。
按一下 [選擇資料來源類型] 頁面上的 [物件],然後按 [下一步]。
展開 [ORDesignerWalkthrough] 節點 (具有您專案名稱的節點),然後找出並選取 [Customer] 類別。
注意事項 如果 Customer 類別無法使用,請取消精靈、建置專案,然後再次執行精靈。
按一下 [完成] 以建立資料來源,然後將 [Customer] 實體類別加入至 [資料來源] 視窗。
建立資料繫結控制項以將資料顯示在 Windows Form 上
將 LINQ to SQL 資料來源項目從 [資料來源] 視窗拖曳至 Windows Form,就可以建立繫結至實體類別的控制項。
若要加入繫結至實體類別的控制項
在 [設計] 檢視表中開啟 [Form1]。
將 [Customer] 節點從 [資料來源] 視窗拖曳至 [Form1]。
注意事項 若要顯示 [資料來源] 視窗,請按一下 [資料] 功能表上的 [顯示資料來源]。
從 [資料來源] 視窗,將 [Orders] 節點拖曳至 [Form1], 並將它放到 [CustomerDataGridView] 底下。
以程式碼檢視開啟 [Form1]。
將下列程式碼加入至表單的全域範圍中,意即不要指定特定的方法,但要屬於 Form1 類別的一部分:
Private NorthwindDataContext1 As New NorthwindDataContext
private NorthwindDataContext northwindDataContext1 = new NorthwindDataContext();
建立 Form_Load 事件的事件處理常式,並將下列程式碼加入至處理常式中:
CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
customerBindingSource.DataSource = northwindDataContext1.Customers;
測試應用程式
執行應用程式。 現在,表單中有一個 DataGridView 會顯示 Customers 資料表中的資料,並有另一個 DataGridView 會顯示所選取客戶的訂單資料。
注意事項 |
---|
請注意,儲存按鈕已停用 (在下一節中,會實作儲存功能)。 |
若要測試應用程式
按下 F5 鍵。
確認資料確實出現在資料方格中。
選取客戶。
確認顯示的訂單是所選取客戶的訂單。
關閉表單。 (按一下 [偵錯] 功能表上的 [停止偵錯])。
實作儲存功能
如前所述,預設不會啟用儲存按鈕,而且不會實作儲存功能。 同時,為物件資料來源建立資料繫結控制項時,並不會自動加入程式碼以將變更的資料儲存至表單。 本節說明如何啟用儲存按鈕並實作 LINQ to SQL 物件的儲存功能。
若要實作儲存功能
在 [設計] 檢視表中開啟 [Form1]。
選取 [CustomerBindingNavigator] 上的儲存按鈕 (圖示為磁碟片的按鈕)。
在 [屬性] 視窗中,將 [Enabled] 屬性設定為 [True]。
按兩下儲存按鈕以建立事件處理常式,並切換至 [色彩編輯器]。
將下列程式碼加入至儲存按鈕事件處理常式:
Try NorthwindDataContext1.SubmitChanges() Catch ex As Exception MessageBox.Show(ex.Message) End Try
try { northwindDataContext1.SubmitChanges(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
測試應用程式
執行應用程式。 此時,儲存按鈕應為啟用狀態,而且也可以使用儲存資料的功能。
若要測試應用程式
按下 F5 鍵。
修改任一方格中的一些資料 (編輯資料列後,移到方格內的其他地方,即可認可同處理序 (In-Process) 變更)。
按一下儲存按鈕,將變更儲存回資料庫。
關閉表單
按 F5 並確認變更已保存 (或尋找資料庫中的資料表,確認變更已儲存)。
繫結至 LINQ 查詢
除了將 CustomerBindingSource 繫結至 DataContext 以外,您還可以直接繫結至 LINQ 查詢。 如需如何建立 LINQ 查詢的詳細資訊,請參閱 LINQ 查詢簡介 (C#)。
將 Button 和 TextBox 加入至表單
若要了解如何將控制項繫結至 LINQ 查詢,請在表單中加入可讓您輸入查詢參數並且執行查詢的控制項。
若要將控制項加入至表單
在 [設計] 檢視表中開啟 [Form1]。
將 [TextBox] 加入至表單,並將它的 [Name] 屬性設為 [CityTextBox]。
將 [Button] 加入至表單,並設定下列屬性:
Name = RunQueryButton
Text = Run Query
資料繫結至 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;
測試應用程式
執行應用程式。 您現在可以查詢位在特定城市中的客戶。
若要測試應用程式
按下 F5 鍵。
在文字方塊中輸入 London。
按一下 [執行查詢] 按鈕。
確認只顯示 [City] 屬性為 [London] 的客戶。
覆寫執行更新 (插入、更新和刪除作業) 的預設行為
根據預設,執行更新的邏輯是由 LINQ to SQL 執行階段所提供。執行階段會建立以 Select 陳述式為依據的預設 Insert、Update 及 Delete 陳述式,Select 陳述式用於將資料填入實體類別。 如果不想要使用這個預設行為,則可以設定更新行為,並指定特定的預存程序來執行管理資料庫資料所需的插入、更新和刪除作業。 未產生預設行為時 (例如,實體類別是對應至聯結的資料表時),同樣可以這樣做。 此外,在資料庫需要透過預存程序進行資料表存取時,也可以覆寫預設更新行為。
注意事項 |
---|
本節需要額外使用 Northwind 資料庫中的 InsertCustomer、UpdateCustomer 和 DeleteCustomer 預存程序。 如需如何建立這些預存程序的詳細資訊,請參閱逐步解說:建立 Northwind Customers 資料表的更新預存程序。 |
若要覆寫預設更新行為
在 O/R 設計工具 中開啟 [LINQ to SQL] 檔。(在 [方案總管] 中按兩下 [Northwind.dbml] 檔。
在 [伺服器總管]/[資料庫總管] 中展開 Northwind 資料庫的 [預存程序] 節點,找到 [UpdateCustomers] 預存程序。
將 [UpdateCustomers] 預存程序拖曳至 O/R 設計工具。
[UpdateCustomers] 預存程序會加入至方法窗格做為 DataContext 方法。 如需詳細資訊,請參閱 DataContext 方法 (O/R 設計工具)。
選取 O/R 設計工具中的 [Customer] 實體類別。
在 [屬性] 視窗中,選取要覆寫的命令 ([Insert]、[Update] 或 [Delete])。 在這個範例中,是選取 [Update] 屬性。
按一下 [使用執行階段] 旁邊的省略符號,以開啟 [設定行為] 對話方塊。
選取 [自訂]。
選取 [自訂] 清單中的 [UpdateCustomers] 方法。
檢查 [方法引數] 和 [類別屬性] 清單會發現資料表的某些資料行會有兩個 [方法引數] 和兩個 [類別屬性]。 這樣可以方便變更追蹤,並建立陳述式來檢查並行違規。
將原始方法引數 (Original_ArgumentName) 對應至原始屬性 (PropertyName (Original))。 在這個逐步解說中,必須將 [Original_CustomerID] 引數對應至 [CustomerID (Original)] 屬性。
注意事項 根據預設,方法引數會對應至同名的類別屬性。 如果屬性名稱已變更,而且資料表與實體類別不再相符,則您可能需要選取當設計工具無法判斷正確的對應時,所要對應的對等類別屬性。 此外,如果方法引數沒有可對應的有效類別屬性,可以將 [類別屬性] 值設定為 [(無)]。
按一下 [確定]。
測試應用程式
再次執行應用程式,確認 UpdateCustomers 預存程序已正確更新資料庫上的客戶記錄。
若要測試應用程式
按下 F5 鍵。
在方格中的 [ContactName] 資料行中尋找 [ALFKI]。
將名稱從 [Maria Anders] 變更為 Anders。
移離資料列,以認可變更。
按一下儲存按鈕。
關閉表單
按 F5 再次執行應用程式,並確認 [ALFKI] 的 [ContactName] 資料行中只出現 Anders。
後續步驟
根據應用程式需求的不同,在建立 LINQ to SQL 實體類別之後,您可能會想執行幾個步驟。 您可以進行下列作業讓這個應用程式發揮更強的功能:
加入其他預存程序,以用於 Insert 和 Delete 命令。 如需詳細資訊,請參閱 HOW TO:指派預存程序來執行更新、插入和刪除 (O/R 設計工具)。
建構各種 LINQ 查詢,以傳回篩選過的資料。 如需詳細資訊,請參閱 HOW TO:查詢資訊 (LINQ to SQL)。
請參閱
參考
概念
其他資源
LINQ Documentation Roadmap