Как не сделать хардкорные настройки для моей основной базы данных Entity Framework, используемой моим общим хостом? - PullRequest
0 голосов
/ 07 мая 2019

При работе с общим хостом в .net core 2.2 я пытался реализовать проект базы данных, создав класс, который наследуется от класса DbContext.Все идет нормально.Когда я попытался реализовать конструктор для моего контекста следующим образом:

public TestContext(DbContextOptions<TestContext> options) : base(options) { }

... и я пытаюсь создать миграцию, используя

dotnet ef migrations add InitialCreate

для фактического построения базы данных, он показываетмне следующая ошибка:

Unable to create an object of type 'NavisionServicesContext'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

Я также пытался определить проект запуска с параметром --startup-project, но он не работает, так как у меня нет класса запуска для моего общего хоста.

Единственное, что работает, - это переопределение метода OnConfiguring класса DbContext.Моя проблема в том, что тогда мне нужно жестко закодировать строку подключения в этот метод следующим образом:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("Server = (localdb)\\mssqllocaldb; Initial Catalog = TestDatabase; Trusted_Connection = True; MultipleActiveResultSets = true;");
}

И я не нашел способа вставить эту строку подключения в файл настроек, так как не знаюкак использовать IConfigurable внутри моего класса Context.

Как реализовать правильный шаблон проектирования базы данных для моего универсального хоста в .netcore 2.2?

1 Ответ

0 голосов
/ 07 мая 2019

Вам необходимо использовать Microsoft.Extensions.Options.ConfigurationExtensions для хранения значений конфигурации. И самое главное в ядре dotnet - каждая функциональность разделена на разные библиотеки, что дает возможность добавлять только то, что требуется.

Сначала создайте класс параметров подключения для хранения значений

public class ConnectionSettings
{
    public string DefaultConnectionString { get; set; }
}

И добавить конфигурацию в конфигурационный файл как

{
  "connectionSettings": {
    "defaultConnectionString": "Here goes your connection setting"
  }
}

Теперь зарегистрируйте этот класс настроек в универсальном компоновщике хоста как

IHostBuilder builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, configurationBuilder) =>
{
    // Assuming config file is configsettings.json
    configurationBuilder.AddJsonFile("configsettings.json", optional: false, reloadOnChange: false);
    // Using Environment variables as well to override any settings provided
    configurationBuilder.AddEnvironmentVariables();
    // Command line args will be highest prioirty
    configurationBuilder.AddCommandLine(args);
})
.ConfigureServices((hostContext, services) =>
{
    IConfigurationSection config = hostContext.Configuration.GetSection("connectionSettings");
    // Adding class to be part of Options
    services.Configure<ConnectionSettings>(config);
});

Теперь переходим к DbContext

public class MyDbContext : DbContext
{
    private IOptions<ConnectionSettings> connectionSettingsOptions;
    public MyDbContext(IOptions<ConnectionSettings> connectionSettingsOptions)
    {
        this.connectionSettingsOptions = connectionSettingsOptions;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(this.connectionSettingsOptions.Value.DefaultConnectionString);
    }
}

Теперь эта строка подключения может быть переопределена в соответствии с приоритетом ниже 1, который является самым низким, а 3 - самым высоким, потому что я добавил их только в этом порядке при настройке универсального компоновщика хоста

  1. Значение из конфигурационного файла
  2. Значение из переменных среды
  3. Значение из аргументов командной строки, передаваемых как --connectionSettings: defaultConnectionString "myconnectionstring"

Используются пакеты Nuget

  1. Microsoft.EntityFrameworkCore (2.2.4)
  2. Microsoft.Extensions.Configuration.CommandLine (2.2.0)
  3. Microsoft.Extensions.Configuration.EnvironmentVariables (2.2.4)
  4. Microsoft.Extensions.Configuration.Json (2.2.0)
  5. Microsoft.Extensions.Hosting (2.2.0)
  6. Microsoft.Extensions.Options.ConfigurationExtensions (2.2.0)

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

...