教程:使用 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 应用服务,请参阅本教程: