正常来说我们都是使用 Code first的方式来使用Ef Core。 这样当我们的实体类发生变化的时候。我们就需要去修改数据库。这个手动生成修改的脚本。有时候还是比较麻烦的。 EF core 内置了一种机制让我们来更新数据库
Student是一个实体类, MalemaDbContext是我们的dbcontext类。
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MalemaDbContext : DbContext
{
public MalemaDbContext() : base()
{
}
public MalemaDbContext(DbContextOptions<MalemaDbContext> options)
: base(options)
{
this.Database.EnsureCreated();
}
public DbSet<Student> Students { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property(x => x.Name).HasMaxLength(50);
base.OnModelCreating(modelBuilder);
}
}
MalemaMigration
(前面我们一直用的是Migration因为生成的migration文件跟 Migration会有命名上的冲突,所以这边我们改成了 MalemaMigration)
需要使用Nuget添加引用Microsoft.EntityFrameworkCore.Tools
, 并且需要添加引用上面的data项目
(单独添加一个Migration项目,可以让我们的data项目更清晰)
接下来 添加一个文件
public class MigrationDbContext : MalemaDbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
//从环境变量里面读取连接字符串,在我们使用自动化部署(CD)的时候也是需要用 dotnet-ef来跑这个迁移程序的
var db = Environment.GetEnvironmentVariable("dbconnection");
if (string.IsNullOrEmpty(db))
{
//我们本地的数据库连接字符串
db = "Data Source=127.0.0.1;Initial Catalog=MalemaEFCoreMigration;Persist Security Info=True;User Id=sa;Password=malema987%^&";
}
optionsBuilder.UseSqlServer(db);
base.OnConfiguring(optionsBuilder);
}
}
}
可以用下面的git命令把代码签出到本地
git clone https://gitee.com/malema/Examples
git checkout migration/pmc_step_1
工具 -> NuGet 包管理器 -> 程序包管理器控制台 输入如下的命令
PM> Add-Migration Init
Build started...
Build succeeded.
如下图:
执行这个命令后,我们可以看到项目里面
这个时候数据库是还没有生成的。 接下来我们用如下的命令来生成数据库
PM> Update-database
如图
注意的是默认项目必须是 'MalemaMigration'. 还有MalemaMigration必须设成启动项目。
如果碰到错误 Build failed. 我们需要先编译一下我们的项目,解决方案。看看哪边有错。可以使用快捷键 Shit+Ctrl+B
执行完之后我们可以看到我们创建了一个新的数据库
可以用下面的git命令把代码签出到本地
git clone https://gitee.com/malema/Examples
git checkout migration/pmc_step_2
我们会在Student里面新加一个新的属性
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime? UpdatedOnUtc { get; set; }
}
输入如下的命令
PM> add-migration AddUpdatedOnUtc
Build started...
Build succeeded.
它会生成一个新的文件 20210822101354_AddUpdatedOnUtc
并修改 MigrationDbContextModelSnapshot
同样的使用 update-database
就可以把这个新的变化更新到数据库了
PM> Update-database
注意: 团队其它人更新数据库只需要用 update-database就行了。不需要再次使用 Add-Migration 这个工具依赖于 __EFMigrationsHistory 这个表, 更新后的数据是存在这个表的。
Script-Migration -From migrationName
如果没有添加-From参数的话,则生成所有的脚本
如果add-migration之后还没有用update-database可以直接用 remove-migration
来删除migration
使用 update-database migrationName 可以把数据库更新到某个版本。
Update-database init
上面的代码就可以把数据库恢复到 init的状态。 然后接下来就可以用 remove-migration
来删除最近Migration文件