1. 经过 Tools->Nuget Package Manager->Package Manager Console 打开Package Manager Console窗口数据库
2. Default Project选择当前的DbContext所在的项目ide
3. 经过命令开启Migration函数
Enable-Migrations
开启以后,DbContext对应的项目中会生成一个Migrations的文件夹, 主要用来存放各个版本自动生成的更新描述文件spa
相似于下图:code
一般你新建了模型,在数据库建库以后须要执行一次add-migration命令生成一个库初始化的migration记录视频
add-migration 20160201003
后面部分的名字我一般都会按照当天日期拼接当天的版本号组成,另一种不错的实践是按照增长的业务名称命名,英文名称会相对好点.blog
库的更新能够分为手动更新跟自动更新, 一般Code First Migration的文章都会讲这里要经过Update-Database命令来把刚才的变动更新到库里面, 一般DEV环境能够这么作,由于是直连的, 可是咱们的Staging与Production环境是不能够直连的,咱们要怎么作呢?接口
前面有提到能够自动更新,其意思就是说,你经过 add-migration生成了migration脚本,那当程序启动的时候,若是发现数库接口不一致,那这个就须要更新,这个时候若是是自动更新的状态,那程序会自动执行(从意思上等同于update-database, 产生的效果相同,可是并未实际考证是否也是跑的update-database命令), 所以不管是dev环境仍是staging, production均可以经过自动update-database来完成数据库的更新。图片
这里有两步:get
1. 在migrations文件夹下有个configuration的文件, 代码以下:
public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = false; }
AutomaticMigrationsEnable = true 以后, 设置EF为自动作数据库更新。
2. 在Global.cs或者任何程序启动的地方加入:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomerDbContext, Configuration>());
这句是设定当前DbContext的一个初始化配置.
自动迁移,在某些该名称,或者删除字段的时候,会形成现有数据的丢失,这个须要注意,目前我也是在探索过程当中,有进一步的研究成果,会在更新博文说明。
【补充部分】
public partial class InitDefaultData : DbMigration { public override void Up() { Sql(@" --初始化FileType原始数据 insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10001,'客户资料',0,GETDATE(); insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10002,'订单资料',0,GETDATE(); insert into FileType (SysId,FileTypeId,FileTypeName,Status,CreationTime) select NEWID(),10003,'车辆资料',0,GETDATE(); --初始化FileCategory原始数据 insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),1,'图片',0,GETDATE(); insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),2,'复印件',0,GETDATE(); insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),3,'视频',0,GETDATE(); insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),4,'Excel文件',0,GETDATE(); insert into FileCategory (SysId,FileCategoryId,FileCategoryName,Status,CreationTime) select NEWID(),5,'Word文件',0,GETDATE(); "); } public override void Down() { Sql(@"truncate table FileType"); Sql(@"truncate table FileCategory"); } }
能够经过Sql函数来执行一些自定义的SQL脚本。