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

  • 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?

    terça-feira, 1 de dezembro de 2020 20:12

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.
    } 

    quarta-feira, 2 de dezembro de 2020 01:04
    Moderador
  • 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!

    quarta-feira, 2 de dezembro de 2020 10:15
  • Boa noite, 

    Do que eu li no artigo que você criaria outra classe que mudaria sua string.

    public MyController(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    terça-feira, 8 de dezembro de 2020 00:23
    Moderador