public class Student { public int ID { get; set; } [Required] [StringLength(200)] public string Name { get; set; } public int Gender { get; set; } [Required] [StringLength(200)] public string Major { get; set; } public DateTime EntranceDate { get; set; } }
如果输入[Required]时没有智能感知,很可能是没有引用相应的命名空间,VS可以很方便的协助我们添加:
这样就会在文件头部添加如下引用:
using System.ComponentModel.DataAnnotations;
直接运行项目(Ctrl+F5),此时我们会看到如下的错误页面:
相信使用EF的同学都会遇到这个页面,上面的提示也很明确,包含两个层次的信息:
1. 数据库创建之后模型改变了。
2. 可以使用数据迁移来更新数据库。
数据迁移(Migrations)
从VS的[工具]菜单中,找到Nuget包管理器控制台:
启用数据迁移
在控制台中输入如下命令:Enable-Migrations
这时会在项目目录中增加一个Migrations文件夹,里面放置了两个文件:
EF会通过C#代码的方式将每一次对模型的修改保存到这个文件夹中,现在来看下生成的文件内容:
每个迁移文件,都包含Up和Down两个重写函数,分别对应于更新和回退。上面的代码也很直白,Up函数中创建一个Students表,定义表结构并指定ID主键(PrimaryKey),Down函数用来回退操作,里面简单的删除了Students表。
可以看到,这里的创建表操作并没有使用最新的模型(Name列没有nullable的设置),因为这是初始模型对应的表结构,EF会在数据库中自动生成一个名为__MigrationHistory表来跟踪数据库的状态。
增加迁移项
增加迁移项需要我们手工来进行,在程序包管理器控制台中,输入如下命令:
Add-Migration Add_Annotation_Name_Major
这时会在Migrations目录下生成迁移文件,文件是以[时间+迁移名]命名的,方便查找:
201612160406415_Add_Annotation_Name_Major.cs
更新到数据库
此时,数据库尚未改变,我们还需要手工命令来更新数据库:
Update-Database
此时,再来查看数据库中Students的表结构:
Name列的数据类型和是否允许Null都已经改变了。
在真实的项目中,数据库可能部署在远程服务器中,这时我们就不能直接在VS中通过Update-Database来更新数据库了。
不过我们可以生成更新SQL脚本,然后拿到数据库服务器上执行。生成这个SQL脚本的方法:
Update-Database -Script
-SourceMigration: InitialCreate
-TargetMigration: Add_Annotation_Name_Major
来看下生成的SQL更新脚本:
有了这个SQL更新脚本,我们就可以方便的更新远程数据库了。
视图的客户端验证
现在运行项目,转到创建页面:
可以看到,如果Name为空则会有错误提示信息,而Major输入字符串过多,也会有提示信息,而这些设置是来自模型的数据注解。
这个客户端验证是有jQuery的validation插件提供的: