- 20210331014734_initDb.cs 主迁移文件,包含升级的Up和降级的Down方法
- MyContextModelSnapshot.cs 当前数据库的快照,这个在EF中是没有的,查了下新的数据库迁移表,简化了model列等,看样子是把迁移跟踪放到快照中了。
EF Core 继承了EF的大部分特性和功能,做了更多的优化和升级。总结一下EF Core中的常用的数据迁移计划,如下都是使用visual studio“ 程序包管理器控制台”方式.
启用/创建迁移
与EF 时创建迁移稍有不同,EF需要两步操作,启用迁移会生成Migrations目录,添加迁移生成迁移代码;EF Core简化为一步,执行添加迁移命令即默认完成启用操作,命令如下:
PM> Add-Migration 迁移名称
第一次命令执行后,会在目录下增加一个Migrations目录,包含两个文件
另外在迁移时增加了两个新的命令,可以指定迁移的输出路径、命名空间
PM> Add-Migration InitialCreate -OutputDir zhanlis
用于输出文件的目录, 路径相对于目标项目目录。 (以上命令会在将迁移文件输出到zhan/lisy路径下,并且命名空间为 *.zhan.lis)
PM> Add-Migration InitialCreate -Namespace zhan.lisy
要用于生成的类的命名空间。 在 EF Core 5.0 中添加。(执行结果,在Migrations目录下新增迁移文件,命名空间为 *.zhan.lisy)
删除迁移
PM> Remove-Migration
避免删除已应用到生产数据库的任何迁移。 这样做意味着你将无法从数据库还原这些迁移,并且可能会破坏后续迁移所做的假设。
列出迁移(EF Core 5.0 新增)
PM> Get-Migration
这个命令比直接看迁移代码多出来一个是否迁移的状态
<P>PM> Get-Migration <P>Build started... <P>Build succeeded. <P>Microsoft.EntityFrameworkCore.Model.Validation[30000] <P>No type was specified for the decimal property 'UnitPrice' on entity type 'Product'. This will cause values to be silently truncated if they do not fit in the default precision and scale. Explicitly specify the SQL server column type that can accommodate all the values in 'OnModelCreating' using 'HasColumnType()', specify precision and scale using 'HasPrecision()' or configure a value converter using 'HasConversion()'. <P>id name safeName applied <P>-- ---- -------- ------- <P>20210331014734_initDb initDb initDb True <P>20210331015835_changeNameLength changeNameLength changeNameLength True <P>20210331021356_changeCreateTimeDateType changeCreateTimeDateType False
生成迁移SQL脚本
PM> Script-Migration [From] [to] -output 输出路径
可以生成a版本到b版本之前的迁移sql。当生产环境下发生迁移时非常好用。
PM> Script-DbContext
可以生成整个数据库的生成脚本,忽略一切迁移。就是直接搞出来一个数据库初始化脚本,也非常有用。
执行数据库迁移
PM> Update-Database [migration name]
执行迁移计划,可以通过指定迁移名称迁移到数据到指定版本,如果迁移名称为0,则撤销所有迁移。
自定义迁移代码
当进行一些迁移时,生成的结果可能和我们预期不一致,此时,可以手动修改迁移代码,如我们重命名列后,生成的迁移计划如下:
migrationBuilder.DropColumn( name: "Name", table: "Customers"); migrationBuilder.AddColumn<string>( name: "FullName", table: "Customers", nullable: true);
实际上,我们只是修改了一列的列名,我们可以将内容替换成:
migrationBuilder.RenameColumn( name: "Name", table: "Customers", newName: "FullName");
迁移代码中执行sql命令
如我们将[FirstName]和[LastName]合并成一列,但是迁移时生成命令会删除列然后新增列,这就造成已有数据的丢失,生成迁移如下:
migrationBuilder.DropColumn( name: "FirstName", table: "Customer"); migrationBuilder.DropColumn( name: "LastName", table: "Customer"); migrationBuilder.AddColumn<string>( name: "FullName", table: "Customer", nullable: true);
我们可以做如下修改:
migrationBuilder.AddColumn<string>( name: "FullName", table: "Customer", nullable: true); migrationBuilder.Sql(@"UPDATE Customer SET FullName = FirstName + ' ' + LastName;"); migrationBuilder.DropColumn( name: "FirstName", table: "Customer"); migrationBuilder.DropColumn( name: "LastName", table: "Customer");