繁体   English   中英

ASP.NET Core 2.1由于环境变量而无法运行迁移

[英]ASP.NET Core 2.1 Unable to run migrations due to environment variable

这是我的项目的结构:

  • App.UI
  • App.Data(ClassLibrary项目)

App.UI包含一些我希望App.Data可以访问的环境变量,例如连接字符串。

现在的问题是,当我尝试进行这样的迁移时:

Add-Migration AppOneBaseMigration -Context AppDbContext -OutputDir Migrations\AppOneMigrations

我收到此错误:

System.ArgumentNullException:值不能为null。 参数名称:路径

这是运行迁移时初始化的代码:

public AppDbContext CreateDbContext(string[] args)
{
    //Debugger.Launch();
    IConfigurationRoot configuration = new ConfigurationBuilder()
    .SetBasePath(ConfigurationManager.GetBasePath(Environment.GetEnvironmentVariable("CENTRAL_APPLICATION_SETTINGS")))
    .AddJsonFile("mssettings.json")
    .Build();
    var builder = new DbContextOptionsBuilder<AppDbContext>();
    builder.UseSqlServer(configuration["DatabaseConfiguration:ConnectionString"]);
    return new AppDbContext(builder.Options);
}

还有其他方法可以将Environment.GetEnvironmentVariable("CENTRAL_APPLICATION_SETTINGS")变量传递给它吗?

我尝试在App.Data设置环境变量,但没有将其选中。

  1. 在Windows中设置环境变量。

当前未设置CENTRAL_APPLICATION_SETTINGS环境变量,这可能就是为什么您会异常的原因。

  1. 您不能从类库中获取配置值。

默认情况下,配置设置是从可执行文件(生成exe的项目)中加载的。

.Net核心可以从各种类型的配置(命令行,XML / JSON文件等)中加载配置值。 以下是来自MSDN的示例:

public class Program
{
    public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
        {
            {"array:entries:0", "value0"},
            {"array:entries:1", "value1"},
            {"array:entries:2", "value2"},
            {"array:entries:4", "value4"},
            {"array:entries:5", "value5"}
        };

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddInMemoryCollection(arrayDict);
                config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
                config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
                config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
                config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
                config.AddCommandLine(args);
            })
            .UseStartup<Startup>();
}

解决您的问题的一种方法:

我猜您应该在该中央配置文件上将CopyToOutput设置为TRUE,以便将其复制到可执行输出中。

然后,您可以仅通过调用AddJsonFile或AddXmlFile来加载配置。 希望这可以帮助您解决问题。

这也将减少您的代码并提高可维护性,因为在加载配置时无需自定义。

希望这可以帮助。

您应该能够在Package Manager控制台中设置变量,然后通过键入以下命令运行Add-Migration命令:

$env:CENTRAL_APPLICATION_SETTINGS="your value"

然后跑

Add-Migration AppOneBaseMigration -Context AppDbContext -OutputDir Migrations\AppOneMigrations

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM