逐步解說:將驗證加入至實體類別
「驗證資料」(Validate Data) 過程會確認資料物件中輸入的值除了符合為應用程式建立的規則外,也符合物件結構描述中的條件約束。 先驗證資料再將更新傳送至基礎資料庫是良好的做法,因為這樣不但會減少錯誤,也會減少應用程式與資料庫之間的可能往返次數。
物件關聯式設計工具 (O/R 設計工具) 提供了部分方法,這種方法可讓使用者對於插入、更新和刪除完整實體 (以及變更個別資料行) 時執行的設計工具產生的程式碼,加以擴充。
這個逐步解說以逐步解說:建立 LINQ to SQL 類別 (O/R 設計工具) 主題為基礎,提供將驗證加入至 LINQ to SQL 實體類別的逐步指示。
在這個逐步解說中,您將學習如何執行下列工作:
加入在特定資料行中的資料變更時執行的驗證。
加入更新完整實體時執行的驗證。
必要條件
若要完成這個逐步解說,您需要下列項目:
Northwind 範例資料庫的存取權。 如需詳細資訊,請參閱 HOW TO:安裝範例資料庫。
注意事項 |
---|
您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱 Visual Studio 設定。 |
開啟 ORDesignerWalkthrough 方案
若要開啟 ORDesignerWalkthrough 方案
指向 [檔案] 功能表上的 [開啟],然後按一下 [專案/方案],再巡覽至 ORDesignerWalkthrough.sln 檔案的位置。
注意事項 ORDesignerWalkthrough.sln 檔案是在逐步解說:建立 LINQ to SQL 類別 (O/R 設計工具) 主題中建立,是完成這個逐步解說的必要條件。 如果您還沒完成逐步解說:建立 LINQ to SQL 類別 (O/R 設計工具) 主題,請先完成該主題,並在完成時儲存方案。
加入在特定資料行中的值變更時的驗證
在這部分的逐步解說中,您會對某個訂單的 RequiredDate 資料行加入驗證邏輯。 同時也會加入程式碼來確認 RequiredDate 早於目前的日期。 因為驗證是在實際類別定義 (而不是使用者介面) 中執行,所以如果值無法通過驗證,就會擲回例外狀況 (Exception)。
若要在資料行值變更期間驗證資料
在 O/R 設計工具中開啟 Northwind.dbml 檔案 (按兩下 [方案總管] 中的 [Northwind.dbml] 檔案)。
因為是要對訂單的 RequiredDate 加入驗證,所以請以滑鼠右鍵按一下設計工具中的 Order 類別,然後按一下 [檢視程式碼]。
會以訂單的部分類別開啟 [程式碼編輯器]。
將游標放在部分 Order 類別中。
如果是 Visual Basic 專案:
展開 [方法名稱] 清單 (顯示 [(宣告)] 的下拉式方塊)。
按一下 [OnRequiredDateChanging]。
OnRequiredDateChanging 方法會加入至部分 Order 類別中。
在 OnRequiredDataChanging 方法內加入下列程式碼,以確保輸入的 RequiredDate 值未早於目前的日期:
If value.HasValue Then If value < Today Then Throw New Exception("Required Date cannot be in the past") End If End If
C# 專案:
在部分 Order 類別中加入下列程式碼,以確保輸入的 RequiredDate 值未早於目前的日期:
partial void OnRequiredDateChanging(System.DateTime? value) { if (value < System.DateTime.Today) { throw new System.Exception("Required Date cannot be in the past"); } }
測試應用程式
測試驗證邏輯時,需要執行應用程式,並輸入可以讓驗證失敗的值。
若要測試應用程式
按下 F5 鍵。
在顯示訂單的方格中,將某個訂單的 [RequiredDate] 變更為早於目前日期的日期,並移離記錄以接受變更。
新的值會讓驗證失敗,而且會如預期擲回例外狀況。
關閉表單。 (停止偵錯)。
處理 DataGridView 中的驗證錯誤
在測試應用程式時產生來自 DataGridView 的錯誤訊息,指示開發人員要處理 DataError 事件。 下列程序顯示如何處理這個事件。
若要處理 DataGridView 中的驗證錯誤
在 [程式碼編輯器] 中開啟 Form1。
選取 [OrdersDataGridView]。
為 DataError 事件建立事件處理常式。
加入程式碼以顯示錯誤。 事件處理常式會與下列類似:
Private Sub OrdersDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles OrdersDataGridView.DataError MessageBox.Show(e.Exception.Message) End Sub
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { MessageBox.Show(e.Exception.Message); }
加入更新實體類別時執行的驗證
除了可以檢查變更期間的值以外,您還可以在發生整個實體類別的更新時驗證資料。 更新期間執行的驗證可以應商務規則 (Business Rule) 的需要,比較多個資料行的值。 例如,下列程序顯示如何在運費低於所設限制時,驗證合作的是正確的貨運公司。
若要在實體類別更新期間驗證資料
在 O/R 設計工具中開啟 Northwind.dbml 檔案 (按兩下 [方案總管] 中的 [Northwind.dbml] 檔案)。
因為是對完整 Order 類別加入更新驗證,所以必須存取的部分方法是位在產生的 DataContext 類別 (NorthwindDataContext) 中。 以滑鼠右鍵按一下 O/R Designer 中的空白區域,然後按一下 [檢視程式碼]。
會以 NorthwindDataContext 的部分類別開啟 [程式碼編輯器]。
將游標放在 NorthwindDataset 部分類別中。
如果是 Visual Basic 專案:
展開 [方法名稱] 清單 (顯示 [(宣告)] 的下拉式方塊)。
按一下 [UpdateOrder]。
UpdateOrder 方法會加入至部分 NorthwindDataContext 類別中。
如果 [Freight] 值低於 10,Federal Shipping 就不會送貨。 因此請在 UpdateOrder 方法內加入下列程式碼,以確保在 [Freight] 值低於 10 時輸入的 [ShipVia] 值不是 [Federal Shipping]。
If (instance.ShipVia = 3) And (instance.Freight < 10) Then Dim ErrorMessage As String = "Federal Shipping " & _ "does not deliver for less than 10. " & _ "You must use a different shipper." Throw New Exception(ErrorMessage) End If
C# 專案:
在部分 NorthwindDataContext 類別中加入下列程式碼,以確保在 [Freight] 值低於 10 時輸入的 [ShipVia] 值不是 [Federal Shipping]。
partial void UpdateOrder(Order instance) { if ((instance.ShipVia == 3) && (instance.Freight < 10)) { string ErrorMessage = "Federal Shipping " + "does not deliver for less than 10. " + "You must use a different shipper."; throw new System.Exception(ErrorMessage); } }
測試應用程式
若要測試驗證邏輯,請執行應用程式,並輸入可以讓驗證失敗的值。
若要測試應用程式
按下 F5 鍵。
在顯示訂單的方格中,找到 [ShipVia] 為 3 的記錄。 然後將 [Freight] 變更為 5,再移離記錄以接受變更。
因為驗證要到實際送出記錄進行更新時才會執行,所以驗證還不會傳回失敗結果。
按一下表單上的 [Save] 按鈕。
此時,驗證會失敗,並擲回例外狀況。
關閉表單 (停止偵錯)。
後續步驟
根據應用程式需求的不同,在加入 LINQ to SQL 實體類別的驗證之後,您可能會想執行幾個步驟。 您可以進行下列作業讓這個應用程式發揮更強的功能:
- 建立其他 LINQ 查詢以排序和篩選資料。 如需詳細資訊,請參閱 LINQ to SQL 查詢。
請參閱
工作
逐步解說:建立 LINQ to SQL 類別 (O/R 設計工具)