演练:向实体类添加验证
“验证数据”是指确认输入到数据对象中的值是否遵从对象架构内的约束,以及是否遵从为应用程序所建立的规则的过程。 在将更新发送到基础数据库之前对数据进行验证是一种很好的做法,这样可以减少错误以及应用程序和数据库之间潜在的往返行程量。
对象关系设计器(O/R 设计器)提供了分部方法,使用户可以扩展设计器生成的代码,这些代码在插入、更新和删除完整实体期间以及在更改单个列的期间及之后运行。
本演练提供关于向 LINQ to SQL 实体类添加验证的分步指导,并对演练:创建 LINQ to SQL 类(O/R 设计器)主题进行一些扩展。
在本演练中,您将了解如何执行以下任务:
添加对特定列中的数据更改的验证。
添加对完整实体更新的验证。
系统必备
若要完成此演练,需要满足以下条件:
在演练:创建 LINQ to SQL 类(O/R 设计器)中创建的项目。
能够访问 Northwind 示例数据库。 有关更多信息,请参见如何:安装示例数据库。
提示
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
打开 ORDesignerWalkthrough 解决方案
打开 ORDesignerWalkthrough 解决方案
在**“文件”菜单上指向“打开”,单击“项目/解决方案”**,然后定位到 ORDesignerWalkthrough.sln 文件的位置。
提示
ORDesignerWalkthrough.sln 是在演练:创建 LINQ to SQL 类(O/R 设计器)主题中创建的文件,它是完成本演练的必备组件。 如果您尚未完成演练:创建 LINQ to SQL 类(O/R 设计器)主题,请完成该主题并在完成时保存该解决方案。
添加对特定列值更改的验证
在本部分的演练中,您将对订单的 RequiredDate 列添加验证逻辑。 您将添加代码以验证 RequiredDate 是否早于当前日期。 因为验证在实际列定义(而不是用户界面)中执行,所以如果值验证失败将引发异常。
在列值更改过程中验证数据
在 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); }
添加对实体类更新的验证
除了在更改过程中检查值,还可以在尝试更新整个实体类时验证数据。 在尝试进行更新操作的过程中进行的验证可以比较多个列中的值(如果业务规则要求这样做)。 例如,下面的过程演示如何验证当运费低于设置的限制时是否使用了正确的运输公司。
在实体类更新过程中验证数据
在 O/R 设计器中打开**“Northwind.dbml”文件。 (在“解决方案资源管理器”中双击“Northwind.dbml”**文件。)
因为您将向完整 Order 类的更新添加验证,所以要访问的分部方法位于生成的 DataContext 类中 (NorthwindDataContext)。 右击 O/R 设计器中的空白区域,然后单击**“查看代码”**。
代码编辑器将在 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 并将光标从该记录移开以接受更改。
因为验证在实际提交记录进行更新时才执行,所以验证目前尚未失败。
单击窗体上的**“保存”**按钮。
此时验证失败并引发异常。
关闭窗体。 (停止调试。)
后续步骤
根据应用程序的要求,可能需要在向 LINQ to SQL 实体类添加验证后执行几步操作。 您可以通过以下操作来增强此应用程序的功能:
- 创建更多 LINQ 查询以排序和筛选数据。 有关信息,请参见 LINQ to SQL 查询。