教程:使用 ASP.NET MVC 应用增强 EF Database First 的数据验证

使用 MVC、实体框架和 ASP.NET 基架,可以创建一个 Web 应用程序来提供现有数据库的接口。 本教程系列介绍如何自动生成代码,使用户能够显示、编辑、创建和删除驻留在数据库表中的数据。 生成的代码对应于数据库表中的列。

本教程重点介绍如何向数据模型添加数据注释,以指定验证要求和显示格式。 根据用户对评论部分的反馈进行了改进。

在本教程中,你将了解:

  • 添加数据批注
  • 添加元数据类

先决条件

添加数据批注

如前面主题中所述,某些数据验证规则会自动应用于用户输入。 例如,只能为 Grade 属性提供数字。 若要指定更多数据验证规则,可以将数据注释添加到模型类。 这些注释将应用于整个 Web 应用程序中的指定属性。 还可以应用格式设置属性,以更改属性的显示方式;例如,更改用于文本标签的值。

在本教程中,你将添加数据注释以限制为 FirstName、LastName 和 MiddleName 属性提供的值的长度。 在数据库中,这些值限制为 50 个字符;但是,在 Web 应用程序中,当前未强制实施字符限制。 如果用户为其中一个值提供超过 50 个字符,则尝试将值保存到数据库时,页面将崩溃。 还将成绩限制为 0 到 4 之间的值。

选择 “模型>ContosoModel.edmx>ContosoModel.tt ”并打开 Student.cs 文件。 将以下突出显示的代码添加到 类。

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Student
    {
        public Student()
        {
            this.Enrollments = new HashSet<Enrollment>();
        }
    
        public int StudentID { get; set; }
        [StringLength(50)]
        public string LastName { get; set; }
        [StringLength(50)]
        public string FirstName { get; set; }
        public Nullable<System.DateTime> EnrollmentDate { get; set; }
        [StringLength(50)]
        public string MiddleName { get; set; }
    
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

打开 Enrollment.cs 并添加以下突出显示的代码。

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Enrollment
    {
        public int EnrollmentID { get; set; }
        [Range(0, 4)]
        public Nullable<decimal> Grade { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
    
        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
    }
}

生成解决方案。

单击“ 学生列表 ”,然后选择 “编辑”。 如果尝试输入超过 50 个字符,将显示一条错误消息。

显示错误消息

返回主页。 单击“ 注册列表 ”,然后选择 “编辑”。 尝试提供高于 4 的成绩。 将收到此错误: 字段“成绩”必须介于 0 和 4 之间。

添加元数据类

如果不希望数据库发生更改,可以将验证属性直接添加到模型类;但是,如果数据库发生更改,并且需要重新生成模型类,则会丢失应用于模型类的所有属性。 此方法可能非常低效,并且容易丢失重要的验证规则。

若要避免此问题,可以添加包含属性的元数据类。 将模型类关联到元数据类时,这些属性将应用于模型。 在此方法中,可以重新生成模型类,而不会丢失已应用于元数据类的所有属性。

Models 文件夹中,添加名为 Metadata.cs 的类。

Metadata.cs 中的代码替换为以下代码。

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    public class StudentMetadata
    {
        [StringLength(50)]
        [Display(Name="Last Name")]
        public string LastName;

        [StringLength(50)]
        [Display(Name="First Name")]
        public string FirstName;

        [StringLength(50)]
        [Display(Name="Middle Name")]
        public string MiddleName;

        [Display(Name = "Enrollment Date")]
        public Nullable<System.DateTime> EnrollmentDate;
    }

    public class EnrollmentMetadata
    {
        [Range(0, 4)]
        public Nullable<decimal> Grade;
    }
}

这些元数据类包含以前应用于模型类的所有验证属性。 Display 属性用于更改用于文本标签的值。

现在,必须将模型类与元数据类相关联。

Models 文件夹中,添加名为 PartialClasses.cs 的类。

将文件的内容替换为以下代码。

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    [MetadataType(typeof(EnrollmentMetadata))]
    public partial class Enrollment
    {
    }
}

请注意,每个类都标记为类 partial ,并且每个类都与自动生成的类的名称和命名空间匹配。 通过将元数据属性应用于分部类,可以确保数据验证属性将应用于自动生成的类。 重新生成模型类时,这些属性不会丢失,因为元数据属性在未重新生成的分部类中应用。

若要重新生成自动生成的类,请打开 ContosoModel.edmx 文件。 再次右键单击设计图面,然后选择“ 从数据库更新模型”。 即使尚未更改数据库,此过程也会重新生成类。 在“ 刷新 ”选项卡中,选择“ ”和“ 完成”。

保存 ContosoModel.edmx 文件以应用更改。

打开 Student.cs 文件或 Enrollment.cs 文件,请注意之前应用的数据验证属性不再位于文件中。 但是,请运行应用程序,请注意,输入数据时仍会应用验证规则。

结论

本系列提供了一个简单的示例,说明如何从现有数据库生成代码,使用户能够编辑、更新、创建和删除数据。 它使用 ASP.NET MVC 5、实体框架和 ASP.NET 基架来创建项目。

有关 Code First 开发的介绍性示例,请参阅使用 ASP.NET MVC 5 入门

有关更高级的示例,请参阅 为 ASP.NET MVC 4 应用创建实体框架数据模型。 请注意,用于处理 Database First 中的数据的 DbContext API 与用于处理 Code First 中的数据的 API 相同。 即使打算使用 Database First,也可以通过 Code First 教程了解如何处理更复杂的方案,例如读取和更新相关数据、处理并发冲突等。 唯一的区别在于数据库、上下文类和实体类的创建方式。

其他资源

有关可应用于属性和类的数据验证注释的完整列表,请参阅 System.ComponentModel.DataAnnotations

后续步骤

在本教程中,你将了解:

  • 添加了数据批注
  • 添加了元数据类

若要了解如何将 Web 应用和 SQL 数据库部署到Azure 应用服务,请参阅本教程: