针对Code First来说关注的只有实体类。当需求变更时只需要添加新的实体类或者在实体类中添加、删除、修改属性即可。但是修改完成之后要如何将修改同步到数据库中?
migration 机制就出现了
●启用Migrations
●通过Add-Migration添加Migration
●Update-Database更新数据库
●更新模型并添加新的Migration
●启动应用时自动将数据库更新至最新版本
●关于Automatic Migrations(自动迁移)
启用Migrations
enable-migrations
开启自动迁移。
通过Add-Migration添加Migration
如果已经存在数据库那么需要使用–IgnoreChanges参数来创建一个空的Migration来对应当前的数据库模型:
Add-Migration InitialCreate –IgnoreChanges
Update-Database更新数据库
这时数据库中多了一个名称为__MigrationsHistory表并有一条记录。
更新模型并添加新的Migration
1、在实体模型中添加属性 例如 xxx
2、add-migration addxxxColumn // addxxxColumn:名称最好与变更相关用于区分多个Migration便于维护:
3、Migrations文件夹中就多个类 addxxxColumn
4、update-database 命令将新的变更同步到数据库中
注:使用参数-Verbose可以看到更多执行信息,包括执行的SQL语句。
启动应用时自动将数据库更新至最新
启动应用时将数据库更新至最新可以省略“update-database”命令执行这一过程,只需要添加了Migration,并且该Migration没有同步到数据库,那么在应用执行(实际上是DbContext在创建模型时OnModelCreating)将会把修改同步到数据库。
》Database.SetInitializer(new MigrateDatabaseToLatestVersion<demoEF, Migrations.Configuration>());
只要运行程序, 就会自动updata-database啦
关于Automatic Migrations(自动迁移)
自动迁移指的是在执行“update-database”命令时,将对比实体模型与数据库结构,如果它们有差异则以实体模型为准,将差异同步到数据库。相当于省略了add-migration命令。
自动更新数据库(migrate database to latest version)与自动迁移(automatic migrations),
前者省略“update-database”后者省略“add-migration”,如果一起使用则两者都省略,
开发者仅需通过enable-migrations命令开启迁移,
然后在开发中修改完成实体类,就可以调试程序,调试程序过程中自动更新数据库结构。