EFCore迁移项目同时支持配置文件与命令行
warning:
这篇文章距离上次修改已过713天,其中的内容可能已经有所变动。
在之前的文章中,已经尝试将EFCore
的迁移操作单独放在了一个类库项目中。但采用的是命令行传入连接字符串,在实际使用过程中发现其实很不友好,需要去找链接字符串。因此对其进行一些改造,同时有以下约束:
- 存在命令行传入的字符串时,优先使用命令行传入的
- 如果无命令行传入的,则使用配置文件的
添加配置文件
在项目中添加appsettings.json
(命名可以随意),并添加以下内容:
{
"ConnectionStrings": {
"Default": "Server=localhost;Port=3306; Database=数据库名;User ID=用户名;Password=密码;Charset=utf8mb4;"
}
}
改造Factory
using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using ZeroSum.Extend.EFCore.MySql.EntityFrameworks;
namespace ZRisker.EFCore;
public class ZeroSumZSADesignTimeDbContextFactory : IDesignTimeDbContextFactory<ZeroSumDbContext>
{
public ZeroSumDbContext CreateDbContext(string[] args)
{
var connectionString = string.Empty;
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
if (args.Length > 0)
{
connectionString = args[0];
}
else
{
connectionString = config["ConnectionStrings:Default"];
}
var optionsBuilder = new DbContextOptionsBuilder<ZeroSumDbContext>();
var serverVersion = new MySqlServerVersion(ServerVersion.AutoDetect(connectionString));
optionsBuilder.UseMySql(
connectionString,
serverVersion,
b => b.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name)
);
return new ZeroSumDbContext(optionsBuilder.Options);
}
}
大功告成
改造完成,在使用时,直接切换到迁移项目所在目录,执行迁移命令即可,无需再附加连接字符串(需提前在配置文件中配置好)
参考命令:
dotnet ef migration name
评论已关闭