EFCore迁移项目同时支持配置文件与命令行

warning: 这篇文章距离上次修改已过701天,其中的内容可能已经有所变动。

在之前的文章中,已经尝试将EFCore的迁移操作单独放在了一个类库项目中。但采用的是命令行传入连接字符串,在实际使用过程中发现其实很不友好,需要去找链接字符串。因此对其进行一些改造,同时有以下约束:

  1. 存在命令行传入的字符串时,优先使用命令行传入的
  2. 如果无命令行传入的,则使用配置文件的

添加配置文件

在项目中添加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
none
最后修改于:2022年12月20日 22:48

评论已关闭