Переключение базы данных с использованием маршрутов - PullRequest
0 голосов
/ 26 февраля 2019

Вот мой сценарий:

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

Пример:

switch(route)
{
    case(URL/A):
    { 
        USE DATABASE 1 
    }
    case(URL/B):
    { 
        USE DATABASE 2
    }
    DEFAULT:
        USE DATABASE DEFAULT
 }

Возможно ли это

Ответы [ 3 ]

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

Зарегистрируйте свой контекст (как область действия, на запрос) и используйте фабричный метод для динамического создания контекста с указанной строкой соединения на основе текущего маршрута (который должен быть доступен из HttpContext или чего-то подобного).Если схемы баз данных одинаковы, а данные различны, это должно работать легко.Я не могу предоставить вам фрагмент кода, потому что это в основном зависит от того, какая у вас структура DI.

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

Поскольку вы используете ASP.NET MVC, ваши маршруты зависят от ваших контроллеров.Тогда вы можете представить себе ControllerA, использующий DatabaseA, и ControllerB, использующий DatabaseB.

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

Я бы использовал следующие фрагменты кодавнедрить экземпляры DbContextOptionsBuilder внутри Startup.ConfigureServices ()

var ContextAOptionsBuilder = new DbContextOptionsBuilder<ContextA>();
var ContextBOptionsBuilder = new DbContextOptionsBuilder<ContextB>();

Затем вы можете настроить ваши сборщики таким образом (в зависимости от ваших параметров)

ContextAOptionsBuilder.UseSqlServer(Configuration.GetConnectionString("ContextAConnectionString"), builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null);
        });
ContextAOptionsBuilder.EnableSensitiveDataLogging();

Затем вы можете внедрить их какпо-отдельности:

services.AddSingleton(typeof(DbContextOptionsBuilder<ContextA>),ContextAOptionsBuilder);

Вы можете использовать BaseController, параметры конструктора которого могут получить доступ к сервисам следующим образом:

public BaseController(IConfiguration configuration, IMemoryCache memoryCache,
        IHttpContextAccessor contextAccessor,
        DbContextOptionsBuilder<ContextA> ContextAOptionsBuilder,
        DbContextOptionsBuilder<ContextB> ContextBOptionsBuilder){}

Конечно, ControllerA и ControllerB являются наследниками классов BaseController,Вы можете получить доступ к нужному сборщику довольно просто.

  public ControllerA(IConfiguration configuration,
                     IMemoryCache cache, 
                     IHttpContextAccessor contextAccessor, 
                     DbContextOptionsBuilder<ContextA> ContextAOptionsBuilder,
                     DbContextOptionsBuilder<ContextB> ContextBOptionsBuilder)
    :base(configuration, cache, contextAccessor, ContextAOptionsBuilder,ContextBOptionsBuilder)
    { 
         //Create your DbContext using the builder
    }

Таким образом, вы можете использовать одну, другую или обе базы данных для построения вашего контекста

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

Это решение работает для меня в приложении ASP.NET Core MVC, я все еще изучаю среду, но, возможно, мой ответ дал вам точность относительно нескольких DbContexts.

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

Вы можете создать 3 строки подключения и 3 класса доступа к данным.Сначала ваш класс использует, например, DropCreateDatabaseIfModelChanges, другие используют CreateDatabaseIfNotExists.Когда вы звоните в первый класс, ваша база данных создается тогда, когда вам нужны другие, и вам не нужно будет создавать ее заново.

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