Получить строку подключения из application.json - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть проект .Infrastructure для сущностей и миграций и проект .Web с файлом application.json, где у меня есть строка подключения

В проекте Infrastrusture у меня есть ApplicationContextFactory для запуска миграций

Вот код

public class ApplicationContextFactory: IDesignTimeDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        optionsBuilder.UseSqlServer(connectionString);
        return new ApplicationDbContext(optionsBuilder.Options);
    }
}

Эта строка не работает, потому что файл json приложения находится в проекте .Web.

.SetBasePath (Directory.GetCurrentDirectory ())

Вот моя структура решения

enter image description here

Как мне получить строку подключения из нее?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

В частности, IDesignTimeDbContextFactory предназначен для миграции на что-то вроде библиотеки классов, где не задействован стартовый проект.Если вы хорошо используете явный стартовый проект при миграции, посмотрите ответ @ poke и избавьтесь от своей фабрики, так как она вам не нужна.

Однако, если вы хотите продолжать идти по этому путиВы должны понимать, что, как видно из названия, это «время проектирования», то есть разработки.Таким образом, получение строки подключения из конфигурации на самом деле не имеет смысла, поскольку это всегда будет ваша база данных разработки.Вот почему документы просто ссылаются на эту строку подключения явно.Не уверен, почему каждый разработчик думает, что ему нужно подумать об этом Microsoft.

Это даже не должно создавать проблемы в командной среде.Если вы используете локальный экземпляр MSSQLLocalDb, а все ваши разработчики используют Visual Studio, то строка подключения фактически не зависит от разработчика.Или, если вы раскручиваете экземпляр SQL Server в контейнере, то каждый разработчик будет работать с той же самой настройкой контейнера.

Если есть какой-то сценарий, в котором вам нужно разрешить специфичные для разработчика строки подключения, то выможно использовать конфигурацию для этого.Тем не менее, вы должны просто использовать пользовательские секреты, и вам по-прежнему не нужен доступ к appsettings.json в вашем веб-проекте.

0 голосов
/ 25 февраля 2019

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

Например, чтобы добавить миграцию:

cd src\TooSeeWeb.Infrastructure
dotnet ef migrations add ExampleMigration -s ..\TooSeeWeb

Это будет указывать ..\TooSeeWeb в качестве запускаемого проекта, поэтому миграция будет выполняться так, как если бы все, что связано с EF, действительно было внутри этого веб-проекта.

Аналогично, это -sили --startup-project параметр также может использоваться с другими командами, например dotnet ef database update -s ..\TooSeeWeb.

...