EF Core многократная база данных той же схемы - PullRequest
0 голосов
/ 15 февраля 2019

Использование EF Core .net 2.2.

Попытка создать приложение, в котором есть «живая» база данных и «тестовая» база данных, поддерживающая мое приложение.В настоящее время я публикую несколько сайтов, каждый из которых имеет свои собственные DBContexts, и непосредственно перед публикацией я закомментирую и меняю код строки подключения / db в своем файле startup.cs.

ex:

//services.AddDbContext<DataContext>(options =>
//    options.UseSqlServer(Configuration.GetConnectionString("TestDataContext")));

 services.AddDbContext<DataContext>(options =>
               options.UseSqlServer(Configuration.GetConnectionString("LiveDataContext")));

Тогда мои два сайта:

testdata.site.com и aliveata.site.com

Это работает, но это отнимает много времени и неэффективно всякий раз, когда производятся обновления сайта / контроллеров / представлений и т. Д.Кроме того, если бы я когда-либо хотел, чтобы более двух сайтов использовали одну и ту же схему базы данных, необходимая публикация работала бы еще больше.

Вот мое идеальное решение, но я не знаю, как это сделать:

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

private readonly POSContext _context;

    public CashierController(POSContext context)
    {
        _context = context;
    }

Например, URL будет выглядеть примерно так:

www.site.com / {test or live} / {controller} / {action}

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

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

Кто-нибудь есть идея или может заставить меня идти по правильному пути?

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Я так и сделал.Я посмотрел на то, что @Norcino сказал выше, и сослался на ссылки в его посте.

Я создал несколько файлов Appsettings {DBIdentifier} .json (также сохранил обычный файл appsettings.json), ex appsettingsste3.json ив эти файлы JSON я помещаю строку подключения, все с тем же именем БД, но указывающую на разные БД на моем SQL-сервере.

ex:

 {
      "ConnectionStrings": {
          "SiteDBContext":\\Connection string for unique DB, all with same schema/tables, etc\\
      }
  }

В моем файле program.cs Iсоздал функцию, которая просматривает текущий каталог на моем веб-сервере, поскольку каждый сайт находится в отдельной папке на моем веб-сервере (например, d d: \ inetpub \ wwwsites \ ste1, d: \ inetpub \ wwwsites \ ste3, d: \ inetpub \wwwsites \ ste3), затем возьмите последние четыре символа этой строки, затем запустите оператор switch при добавлении дополнительного файла json.

Часть измененного мной файла program.cs выглядит следующим образом:

public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                var dirStr = Directory.GetCurrentDirectory().ToString(); //Gets path of directory into string
                var lastFour = dirStr.Substring(dirStr.Length - 4); //gets name of directory (last four characters in path)
                switch (lastFour)
                {
                    case "ste1":
                    case "ste2":
                    case "ste3":
                        string appStr = "appsettings" + lastFour.Substring(3) + ".json";
                        config.AddJsonFile(appStr, optional: false);
                        break;                                               
                }    
            })
                .UseStartup<Startup>()
                .Build();

Тогда, конечно, для ConfigureServices в Startup.cs необходимо:

services.AddDbContext<DataContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SiteDBContext")));

еще не провели жесткого тестирования, чтобы знать, на что будет похожа производительность, но я думаю, что все должно быть в порядке, поскольку program.cs запускается только при первом запуске приложения, и поэтому после запуска приложения не должно быть никакого снижения производительности вообще.(Я прав?)

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

Все зависит от того, как вы публикуете свои приложения и какой уровень контроля вы имеете на своем хостинг-сервере.Вы можете использовать несколько файлов конфигурации, которые имеют разные значения строки подключения, поэтому вместо двух имен строк подключения у вас должен быть только один, например, «MyAppConnectionString», и использовать файлы конфигурации на основе среды, чтобы переопределять его при необходимости.Чтобы узнать больше о конфигурации, посетите страницу: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2

Кроме того, вы можете использовать возможности среды хостинга: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2

. В этом ответе также можно найти полезную информацию: Автоматически настраивать appsettings.json для сред разработки и выпуска в ядре asp.net?

...