Определить строку подключения на основе значения конфигурации - PullRequest
0 голосов
/ 08 мая 2018

Я использую .Net Core

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

У меня есть база данных с именем Department1, в которой находятся более старые записи, и руководство принимает решение периодически перемещать записи различных отделов в Department2, обновляя параметр переключения с запятой DepartmentToggle в нашей базе данных Config. По сути, наша команда ETL переместит записи в новую базу данных и обновит этот параметр после завершения. Долгосрочный план состоит в том, чтобы переместить эти записи базы данных в облако. Это первый шаг к этому.

Таким образом, если параметр переключения DepartmentToggle имеет значение "1,2,3", это означает, что записи Департаментов 1, 2, 3 находятся в Department2. Итак, мне сначала нужно прочитать значение конфигурации DepartmentToggle из базы данных Config, проверить, включен ли DepartmentId в переключатель. Если да, DepartmentContext должен использовать Department2 connectionString. Ниже мой контекстный класс:

public partial class DepartmentContext : DbContext
{
    // Required for DI container
    public DepartmentContext() { }
    // Required for unit testing
    public DepartmentContext(DbContextOptions options) : base(options) {}

    public virtual DbSet<Faculty> Faculties { get; set; }
    public virtual DbSet<Student> Students { get; set; }
    ......
    //More DbSets

    //connectionString to change based on the DepartmentId
    public static string ConnectionString { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //modelBuilder.Entity<Faculty>(entity => { });
    }
}

Есть предложения?

1 Ответ

0 голосов
/ 09 мая 2018

Вы можете сделать это следующим образом.

public class DepartmentContext : DbContext
{
    public DepartmentContext(
        IDepartmentRequestContext deptRequestContext, 
        IConnectionSelector connSelector) 
    : base(connSelector.GetConnectionString(deptRequestContext.SelectedDepartament))
    {
    }
}

Создайте класс DepartmentRequestContext с регистрацией времени жизни Scoped (или PerRequest в зависимости от вашего контейнера). Затем вы можете создать промежуточное программное обеспечение или обработчик запроса, который будет устанавливать значение SelectedDepartment на основе ваших 1,2,3, загруженных из Config Db. Поскольку SelectedDepartment находится в экземпляре Scoped, то же значение будет доступно в контексте вашего отдела при его создании.

Затем в ConnectionSelector вы в основном читаете IOptions на основе SelectedDepartment и извлекаете соответствующую строку подключения.

Все это решение основано на том факте, что DepartmentContext должен быть создан после того, как отдел уже известен и кэширован в промежуточном программном обеспечении.

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