Динамически создавать DbContext для архитектуры с несколькими базами данных, относясь к зарегистрированному пользователю - PullRequest
0 голосов
/ 03 января 2019

Я работаю над многоуровневой архитектурой с поддержкой нескольких баз данных на одного клиента в MVC. Мне нужно создать DBContext в зависимости от пользователя, вошедшего в слой данных. Как мне создать общий DBContext и установить строку подключения в соответствии с пользователем?

Ниже приведен код для получения строки подключения из Host Databsae и установки ее в базу данных клиента. (В слое данных / хранилища)

private static string GetConnectionString()
{
    int tenantId;
    HostDBContext hostContext = new HostDBContext();

    //Get Tenant and set ID to get required connection string
    tenantId = 1; //Get Tenant Id from session

    var tenantDetails = hostContext.TenantDetails.Find(tenantId);

    if (tenantDetails != null)
    {
        return tenantDetails.connectionstring;
    }

    return "default connection string";
}

1 Ответ

0 голосов
/ 03 января 2019

Вы на правильном пути, но это не будет универсальный DbContext, а только тот, у которого строка соединения установлена ​​во время выполнения.Поэтому вместо GetConnectionString вы хотите создать DbContext фабрику, которая требует, чтобы идентификатор арендатора возвращал ваш новый DbContext ("connectionString").

Давайте назовем его TenantDbContext:

public class TenantDbContext : DbContext
{
    public TenantDbContext(string connectionString) : base(connectionString)
    {
    }
// Or
    public TenantDbContext(int tenantId) : base(GetConnectionString(tenantId))
    {
    }
}

при использовании фабрики:

public class TenantDbContextFactory : IDbContextFactory<TenantDbContext, int>
{
    public TenantDbContext Create(int tenantId)
    {
        var connectionString = GetConnectionString(tenantId);
        return new TenantDbContext(connectionString);
    }
    // ... rest of factory
}

public interface IDbContextFactory<TContext, TKey> where TContext :DbContext
{
     TContext Create(TKey key);
}

Если вы используете контейнер внедрения зависимостей, вы также можете подключить его для возврата TenantDbContext на основе идентификатора арендатора.

...