Изменить строку подключения dbContext из сеанса - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь передать строку подключения моему DBContext в Asp.Net MVC, и это сработало, когда я передал ему статическую переменную.Но мое требование - передать строку подключения из переменной сеанса.

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

Как использовать сеанссохранить строку подключения в HttpContext.Session и изменить строку подключения DBContext по запросу?

Контекст БД

 public MyContext(string nameOrConnectionString) : base(nameOrConnectionString)
    {

    }

Переменная сеанса

var session = httpContextAccessor.HttpContext.Session.GetString("ConnectionString");

1 Ответ

0 голосов
/ 18 июня 2019

Я не знаю, помогает ли это, но я динамически генерирую строку подключения, используя следующий код (немного урезанный):

public partial class MastersContext : BaseContext
{
    public MastersContext(string connectionString)
        : base(connectionString, typeof(MastersContext), "Entities.Masters.MastersEF")
    {
    }

    public virtual DbSet<Groups> Groups { get; set; }
    public virtual DbSet<Materials> Materials { get; set; }
}

public class BaseContext : DbContext, IDbContext
{
    public BaseContext(string connectionString, Type contextType, string connectionMetadata)
                    : base(GetEntityConnectionString(connectionString,
                                                     contextType.GetTypeInfo().Assembly.GetName().Name,
                                                     connectionMetadata))
    {
        this.Initialise();
    }
}

public static string GetEntityConnectionString(string connectionString, string contextTypeName, string connectionMetadata)
{
    string result = string.Empty;

    EntityConnectionStringBuilder entityConnectionStringBuilder = new EntityConnectionStringBuilder //(System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder)
    {
        Provider = "System.Data.SqlClient",
        ProviderConnectionString = connectionString,
        Metadata = string.Format("res://{0}/{1}.csdl|res://{0}/{1}.ssdl|res://{0}/{1}.msl", contextTypeName, connectionMetadata)
    };

    result = entityConnectionStringBuilder.ToString();

    return result;
}
...