准备
微软文档:迁移
本文概要:如何在独立项目管理迁移?常用的迁移命令有哪些?
安装控制台工具
在包含 DbContext 项目以及后面的迁移项目中
Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.1
创建迁移
在 包含 DbContext 的项目中新增文件**DbContextFactory
:
public class WPDbContextFactory : IDesignTimeDbContextFactory<WPDbContext>
{
public WPDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<WPDbContext>();
string connStr = "Data Source=127.0.0.1;Initial Catalog=WP;User ID=sa;Password=123456";
optionsBuilder.UseSqlServer(connStr);
return new WPDbContext(optionsBuilder.Options);
}
}
**DbContextFactory
必须实现IDesignTimeDbContextFactory<out TContext>
接口,TContext必须是DbContext类型。
在程序包管理控制台中,选择要进行迁移的包含DbContext的项目,然后执行命令添加一个迁移:
PM>add-migration initProject
会在项目目录下生成迁移目录 Migrations,其中包含模型快照和刚添加的迁移。
使用独立项目管理迁移
-
新建一个类库项目
PM>Install-Package Microsoft.EntityFrameworkCore.Relational -Version 6.0.1
-
添加对 DbContext 项目的引用
-
将迁移和模型快照文件移动到类库(在原始包含 DbContext 的项目中,先生成一个迁移,然后把迁移和模型快照移动到迁移项目中)
也就是说,第一次迁移必须是从 DbContext 项目中复制过来的(复制后,DbContext中的可以删除)
配置迁移项目
在上面**DbContextFactory
项目中配置迁移项目:
public class WPDbContextFactory : IDesignTimeDbContextFactory<WPDbContext>
{
public WPDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<WPDbContext>();
string connStr = "Data Source=127.0.0.1;Initial Catalog=WorkingPlatform;User ID=sa;Password=123456";
optionsBuilder.UseSqlServer(connStr, d => d.MigrationsAssembly("WP.Migrations")); // 唯一的改动,指定迁移项目程序集名称
return new WPDbContext(optionsBuilder.Options);
}
}
配置完成,在程序包管理控制台中,选择迁移项目,执行update-database
,正常情况下迁移已经更新到数据库中了。
到这里在单独项目中使用迁移就OK了,原始的 DbContext 项目再也没有乱七八糟的迁移相关代码了,整个人都清爽了!
上面实现方式是参照官网,但不完全一致,如果不明白,还是要看官方文档相关文档
常用迁移命令
上面已经演示过:add-migration [changeName]
、update-database
,在看看其他命令。
add-migration
add-migration
命令还可以指定参数-OutputDir
,来给迁移脚本指定输出目录:
PM> add-migration price -outputdir Migrations_SqlServer
可以用来给不同数据库生成不同的脚本分目录。
update-database
不指定迁移版本,默认把最新迁移更新到数据库:
PM>update-database
指定迁移版本:
PM>update-database 20220407143303_init
把数据库迁移到指定的版本,可以是回退(Removing)迁移也可以是应用(Applying)迁移。
注意:可能会造成数据丢失
remove-migration
删除最后一次的迁移脚本
script-migration
不指定版本,则默认生成最新迁移版本的(全部)SQL脚本。
PM>script-migration
可以指定两个版本参数:
PM>script-migration [source] [target]
生成 source 版本到 target 版本的SQL脚本
source 是源版本,target 是目标版本
如果不指定 target,则默认生成到最新版本的SQL脚本。
反向工程
反向工程是指:根据数据库表反向来生成实体类以及DbContext。
PM>Scaffold-DbContext "Data Source=127.0.0.1;Initial Catalog=WP;User ID=sa;Password=123456"
利用反向工程生成的类都被标记为partial
,不建议修改反向工程生成的文件,可以利用部分类特性来调整配置。
生成的 DBContext 文件中默认 override 了OnModelCreating
方法,不过默认调用了部分方法OnModelCreatingPartial
,可以自己配置部分方法OnModelCreatingPartial
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Book>(entity =>
{
entity.HasComment("书籍表");
});
modelBuilder.Entity<SysSetting>(entity =>
{
entity.ToTable("Sys_Settings");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
// 自己配置,可以结合部分类放到单独文件中,避免直接修改反向工程生成的文件
}
反向工程生产的类,大部分情况下还需要自己调整(会挖坑),所以不建议在项目中使用反向工程