与视觉操作界面相比,CodeFirst机制提供了一套命令行模式的迁移工具,协助开发人员有效的进行数据库与数据模型的同步维护操作。
新建一个控制台项目CFMigrationsDemo,选用来自数据库的EF设计器模式, 并向其中添加一个Product.cs类文件,如下图所示:
public class Product
{public int Id { get; set; }public string Name { get; set; }
}
Enable-Migrations :启动此项目的迁移功能
在程序包管理器中控制台输入上述命令,可以看到已经启用CodeFirst项目迁移功能,如下图所示:
Add-Migration MigName:建立迁移文件,Add-Migration 和 MigName中间空一格,MigName为自定义名称,表示要创建的迁移文件名称,建议以有意义的名字来命名。
在程序包管理器控制台输入 Add-Migration AddProduct 以建立迁移文件,如下图所示:
生成的迁移文件如下图所示:
打开迁移文件可以看到如下代码:
public partial class AddProduct : DbMigration{public override void Up(){CreateTable("dbo.Products",c => new{Id = c.Int(nullable: false, identity: true),Name = c.String(),}).PrimaryKey(t => t.Id);}public override void Down(){DropTable("dbo.Products");}}
这是一个继承DbMigration的类文件,CodeFirst迁移通过自动生成的Up和Down方法记录每一次的变动内容,以支持数据库的升级和降级。通过调用Down方法可以将数据库恢复至此次迁移前的状态。
Update-Database:更新数据库
接下来完成第一次迁移操作,在程序包管理器控制平台输入上述命令:
可以看到迁移已经顺利完成,在原来的数据库中添加了一个Product表:
结构变动迁移
在Product.cs类中,添加一个字段Price:
public class Product{public int Id { get; set; }public string Name { get; set; }public int Price { get; set; }}
重新打开程序包管理控制台对话框,在其中键入Add-Migration AddProductPrice添加一个迁移文件,再执行一次Update-Database指令,界面如下图所示:
数据库已经生成Price字段属性:
查看SQL
Update-Database —Verbose: 每一次迁移是通过SQL语句来完成数据库更新操作的,如果想要查看所使用的的SQL语句,可以加上-Verbose标志。
在Prodcut.cs类文件上增加属性Quantity以创建可以存储商品数量的字段:
public class Product{public int Id { get; set; }public string Name { get; set; }public int Price { get; set; }public int Quantity { get; set; }}
首先执行Add-Migration AddProductQuantity命令添加迁移文件,在执行一次Update Database-Verbose命令,这个过程除了完成迁移操作外,同时会显示执行迁移的SQL语句,如下图所示:
指定迁移
Update-Database -TargetMigration:MigrationName:Update-Database 和 -TargetMigration之间有空格。在执行Update—Database命令时,可以进一步指定所要迁移的版本,现在执行Update-Database -TargetMigration:AddProductQuantity,这是当前最新的版本,因此不会起作用。再执行前一个版本的迁移,执行Update-Database-TargetMigration:AddProductPrice命令,会导致降级。
上述过程会导致降级,执行AddProductQuantity中的Down方法删除Quantity字段,恢复到AddProduct的状态。