ASP.NET Core 2.1 Невозможно запустить миграцию из-за переменной среды - PullRequest
0 голосов
/ 21 января 2019

Это структура моего проекта:

  • App.UI
  • App.Data (проект ClassLibrary)

App.UI содержит некоторые переменные окружения, к которым я бы хотел App.Data иметь доступ, например строку подключения.

Проблема сейчас в том, что когда я пытаюсь выполнить миграцию следующим образом:

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

Я получаю эту ошибку:

System.ArgumentNullException: значение не может быть нулевым. Имя параметра: путь

Это код, который инициализируется при выполнении моих миграций:

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, но она не поднялась.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы должны иметь возможность установить переменную в консоли диспетчера пакетов перед запуском команды Add-Migration, набрав

$env:CENTRAL_APPLICATION_SETTINGS="your value"

А затем запустить

Add-Migration AppOneBaseMigration -Context AppDbContext -OutputDir Migrations\AppOneMigrations
0 голосов
/ 21 января 2019
  1. Переменные среды устанавливаются в Windows.

В настоящее время переменная среды CENTRAL_APPLICATION_SETTINGS не установлена, и, вероятно, именно поэтому вы получаете исключение.

Вы не можете получить значения конфигурации из библиотеки классов.

По умолчанию параметры конфигурации загружаются из исполняемого файла (проект, который создает exe).

.Net core может загружать значения конфигурации из различных типов конфигураций (командная строка, 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.Надеюсь, что это поможет вам решить вашу проблему.

Это также уменьшит ваш код и повысит удобство обслуживания, так как при загрузке конфигураций настройки не требуются.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...