Inquiridor
asp.net core Entity Framework alterar string de conexão em tempo de execução

Pergunta
-
Olá pessoal, estou fazendo um sistema onde tenho uma base de dados principal, onde o usuário faz o login, e a partir dai gera uma string de conexão para sua base de dados, cada usuário tem uma base de dados.. já procurei em vários lugares e não encontrei uma solução.
segui alguns passos descritos aqui https://stackoverflow.com/questions/36816215/dynamically-change-connection-string-in-asp-net-core
tentei armazenar a string de conexão em um Claim, mas não consigo obter o claim dentro do contexto para setar em OnConfiguring
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseMySql("server=localhost;user id=root;password=xxxxx;database=database01;convert zero datetime=True;pooling=false", x => x.ServerVersion("8.0.22-mysql")); } }
só preciso alterar a string de conexão, alguma ideia de como fazer?
por exemplo no Controller de login após pegar os dados da de conexão como alterar a string do Contexto desse banco?
Todas as Respostas
-
Boa noite,
Pelo que li, você precisa registrar um provedor de contexto de banco de dados personalizado e, em seguida, usar a fábrica de implementação para obter o que você precisa.
//First register a custom made db context provider services.AddTransient<ApplicationDbContextFactory>(); //Then use implementation factory to get the one you need services.AddTransient(provider => provider.GetService<ApplicationDbContextFactory>().CreateApplicationDbContext());
Dentro desta classe você escreveria algum código para alterar o string de conexão.
public ApplicationDbContext CreateApplicationDbContext(){ //TODO Something clever to create correct ApplicationDbContext with ConnectionString you need. }
-
Eu tinha lido sobre isso já, só não entendi como implementar... se ele configura no Startup.cs como eu altero a string depois disso.
eu encontrei uma breve solução mais não sei se é a ideial, eu estou trabalhando com Interfaces e Repositórios, e quando o usuãrio faz login na base principal, eu armazeno os dados de conexão de sua base em, HttpContext, e dentro de cada Repositorio eu fiz o seguinte:
private readonly OmnisAPIContext _contexto; public ArmazemRepositorio(OmnisAPIContext contexto, IHttpContextAccessor httpContextAccessor) : base(contexto) { _contexto = contexto; dynamic user = httpContextAccessor.HttpContext.Items["User"]; _contexto.Database.GetDbConnection().ConnectionString = user.conBD; }
também tentei fazer isso diretamente no contexto para não ter que fazer em cada repositorio, mas tb não deu certo.. como seria a implementação da classe "CreateApplicationDbContext" do seu exemplo e como alterar a string depois?
Obrigado!
-