Использование строки подключения к базе данных, хранящейся в переменной среды во время миграции - PullRequest
0 голосов
/ 09 марта 2020

У меня есть ASP. NET Основной проект, в котором я храню строку подключения PostgreSQL в переменной окружения. Когда я пытаюсь выполнить начальную миграцию, сборка проекта завершается успешно, но затем выдается исключение:

System.ArgumentNullException: значение не может быть нулевым. (Параметр 'connectionString').

Поэтому я предполагаю, что он неправильно считывает строку подключения. Я предоставляю строку подключения к моему DbContext в методе ConfigureServices следующим образом:

services.AddDbContext<GoalsContext>(options =>  
  options.UseNpgsql(Environment.GetEnvironmentVariable("CONNECTION_STRING")));

Я также пытался это исправить, создав реализацию IDesignTimeDbContextFactory, например:

public class GoalsContextFactory : IDesignTimeDbContextFactory<GoalsContext>
{
  public GoalsContext CreateDbContext(string[] args)
  {
    var optionsBuilder = new DbContextOptionsBuilder<GoalsContext>();
    optionsBuilder.UseNpgsql(Environment.GetEnvironmentVariable("CONNECTION_STRING");

    return new GoalsContext(optionsBuilder.Options);
  }
}

Любая помощь будет Буду очень признателен.

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

[HttpGet]
public string GetConnectionString()
{
  return _config["CONNECTION_STRING"];
}

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

Я также пытался закомментировать мою реализацию IDesignTimeDbContextFactory и вручную добавить вызов метода .AddEnvironmentVariables в мой Program.cs (который я читаю, выполняется автоматически, но я все еще хотеть попробуйте), но ничего из этого не имело никакого эффекта - мой контроллер все еще выдает строку подключения, в то время как миграция Entity Framework Core все еще не получает ее.

Короче говоря, строка подключения да существует, и я даже могу вывести ее, но миграция все еще не выполняется из-за того же исключения.

1 Ответ

0 голосов
/ 10 марта 2020

Согласно моему комментарию.

См. Переменные среды командной строки

Также, если вы хотите обойти настройку переменных, вам нужно посмотреть в перегрузку метода OnConfiguring контекста и используйте флаг IsConfigured в параметре DbOptions, переданном для чтения из файла только в том случае, если в контекст не передана действительная конфигурация.

Я должен предостеречь, что это также приводит к проблемам, когда другие разработчики используют решение, а также вам не следует проверять файлы, которые вы читаете, в общедоступном c репозитории исходного кода, поскольку это одно из них. как люди получают учетные данные о вещах, которые им не следует, изучите Секреты пользователя

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