在实体类中添加验证

注意

数据集和相关类是 2000 年代初的旧 .NET Framework 技术,使应用程序能够在应用程序与数据库断开连接时处理内存中的数据。 它们对于使用户能够修改数据并持续更改回数据库的应用程序特别有用。 虽然数据集已被证明是一项非常成功的技术,但我们建议新的 .NET 应用程序使用 Entity Framework Core。 实体框架提供了一种更自然的方式来将表格数据作为对象模型,并且具有更简单的编程接口。

验证实体类是指确认输入到数据对象中的值是否符合对象架构内的约束,以及是否符合为应用程序所建立的规则的过程。 在将更新发送到基础数据库之前对数据进行验证是一种很好的做法,这样可以减少错误。 还可以减少应用程序和数据库之间的潜在往返行程次数。

Visual Studio 中的 LINQ to SQL 工具提供了分部方法,使用户可以扩展设计器生成的代码,这些代码在插入、更新和删除完整实体期间以及在更改单个列的期间及之后运行。

注意

本主题提供了使用 O/R 设计器将验证添加到实体类的基本步骤。 由于不参考特定实体类将难以执行这些通用步骤,因此我们提供了一个使用实际数据的演练。

添加对特定列值更改的验证

此过程演示当列中的值更改时如何验证数据。 由于验证在类定义(而不是用户界面)中执行,因此如果值导致验证失败,则将引发异常。 请为应用程序中试图更改列值的代码实现错误处理。

注意

本文中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 你可能正在使用其他版本的 Visual Studio 或其他环境设置。 有关详细信息,请参阅个性化设置 IDE

在列值更改过程中验证数据

  1. 在“O/R 设计器”中打开或创建一个新的 LINQ to SQL 类文件(.dbml 文件)。 (在“解决方案资源管理器”中双击 .dbml 文件。)

  2. O/R 设计器中,右键单击要为其添加验证的类,然后选择查看代码

    将打开代码编辑器,其中显示所选实体类的分部类。

  3. 将光标放在该分部类中。

  4. 对于 Visual Basic 项目:

    1. 展开“方法名称”列表

    2. 定位到要为其添加验证的列的 OnCOLUMNNAMEChanging 方法

    3. OnCOLUMNNAMEChanging 方法将添加到分部类中。

    4. 添加下列代码,以首先确认是否已输入了值,然后确保为该列输入的值可被你的应用程序接受。 value 自变量包含建议的值,因此添加逻辑以确认它是否为有效值:

      If value.HasValue Then
          ' Add code to ensure that the value is acceptable.
          ' If value < 1 Then
          '    Throw New Exception("Invalid data!")
          ' End If
      End If
      

    对于 C# 项目:

    由于 C# 项目不会自动生成事件处理程序,因此可以使用 IntelliSense 创建列更改分部方法。 键入 partial 和空格以访问可用分部方法的列表。 单击要为其添加验证的列的列更改方法。 选择列更改分部方法时生成的代码与下面的代码类似:

    partial void OnCOLUMNNAMEChanging(COLUMNDATATYPE value)
        {
           throw new System.NotImplementedException();
        }
    

添加对实体类更新的验证

除了可以在更改过程中检查值之外,还可以在尝试更新完整实体类时验证数据。 在尝试进行更新操作的过程中进行的验证可以比较多个列中的值(如果业务规则要求这样做)。 下面的过程演示在尝试更新完整实体类时如何进行验证。

注意

更新完整实体类的验证代码是在分部 DataContext 类(而不是在特定实体类的分部类)中执行的。

在实体类更新过程中验证数据

  1. 在“O/R 设计器”中打开或创建一个新的 LINQ to SQL 类文件(.dbml 文件)。 (在“解决方案资源管理器”中双击 .dbml 文件。)

  2. 右键单击 O/R 设计器上的空白区域,然后单击“查看代码”

    将打开代码编辑器,其中显示 DataContext 的一个分部类。

  3. 将光标放在 DataContext 的分部类上。

  4. 对于 Visual Basic 项目:

    1. 展开“方法名称”列表

    2. 单击“UpdateENTITYCLASSNAME”

    3. UpdateENTITYCLASSNAME 方法将添加到分部类中。

    4. 使用 instance 参数访问各个列值,如下面的代码所示:

      If (instance.COLUMNNAME = x) And (instance.COLUMNNAME = y) Then
          Dim ErrorMessage As String = "Invalid data!"
          Throw New Exception(ErrorMessage)
      End If
      

    对于 C# 项目:

    由于 C# 项目不会自动生成事件处理程序,因此可以使用 IntelliSense 创建分部 UpdateCLASSNAME 方法。 键入 partial 和空格以访问可用分部方法的列表。 单击要为其添加验证的类的更新方法。 选择 UpdateCLASSNAME 分部方法时生成的代码与下面的代码类似:

    partial void UpdateCLASSNAME(CLASSNAME instance)
    {
        if ((instance.COLUMNNAME == x) && (instance.COLUMNNAME = y))
        {
            string ErrorMessage = "Invalid data!";
            throw new System.Exception(ErrorMessage);
        }
    }