none
Mudar Conexão E.F RRS feed

  • Pergunta

  • Boa tarde estou trabalhando em uma aplicao E.F , gostaria de saber como mudar "apontar" para um outro banco em tempo de execução.

    Um exemplo bem simples.

    se meu usuario for x usa o banco x

    se meu usuario for y usa o banco y e assim por diante.

    Att.

    Obrigado.
    sexta-feira, 8 de fevereiro de 2013 18:10

Respostas

  • Bem, aqui está um exemplo: só baixar o exemplo que se chama Dinamic-ConectionString:

    https://github.com/MayogaX/Entity-Framework-Laboratory/tree/master/Dinamic-ConnectionString

    meio que é simples: eu guardo qual a connection usada na Session. Se precisar de mais explicações me avise


    Twitter: @MayogaX
    Blog: Dev Blog

    • Marcado como Resposta _Manigold_ quinta-feira, 21 de fevereiro de 2013 01:55
    quarta-feira, 13 de fevereiro de 2013 19:01
  • Este processo de mudar a string de conexão do context ocorre em tempo de execução, você faz isto quando for instanciar o objeto...

    Vou copiar o que a Priscila fez, só pra facilitar para você...

    Quando o usuário logar selecione a ConnectionString dele em uma variável Session:

     MyConnectionString MyCs = new MyConnectionString();
     MyCs.ConnectionString = "escolha aqui uma connection string ou busque do banco";
     Session["MyConnectionString"] = MyCs;

    Daí sempre que for instanciar o banco, você chama a Session:

     MyDbContex db = new MyDbContex(((MyConnectionString)Session["MyConnectionString"]).ConnectionString);

    Pronto, você estará "mudando" a connection string em tempo de execução. Se eu não me engano a Session perde seu valor se o usuário não fizer nenhuma requisição no servidor por determinado tempo, sendo assim, mandar um if is null antes de instanciar, verificando se a session está preenchida é sempre bom :)


    Ao infinito e além!



    • Editado Fabio R. Luz quinta-feira, 14 de fevereiro de 2013 16:13
    • Sugerido como Resposta Priscila Mayumi Sato sexta-feira, 15 de fevereiro de 2013 18:01
    • Marcado como Resposta _Manigold_ quinta-feira, 21 de fevereiro de 2013 01:55
    quinta-feira, 14 de fevereiro de 2013 16:11

Todas as Respostas

  • Bem vindo ao fórum da MSDN. Sugiro que você não duplique suas thread pelo fórum.

    Simples: na criação do seu contexto você diz qual a connection string:

    dataContext = new SeuContexto("connectionString");


    Twitter: @MayogaX
    Blog: Dev Blog

    • Sugerido como Resposta Afonso Fernandes sexta-feira, 8 de fevereiro de 2013 18:44
    sexta-feira, 8 de fevereiro de 2013 18:34
  • Não abusando , vc poderia digitar um exemplo ?

    Tks.

    sexta-feira, 8 de fevereiro de 2013 18:36
  • Só pra lembrar, caso você não saiba, a string "connectionString" = o nome da sua ConnectionString, que está localizada no arquivo Web.Config

    Ao infinito e além!

    sexta-feira, 8 de fevereiro de 2013 18:37
  • Perfeito mas eu vou trabalhar com n bancos ao mesmo tempo.

    sexta-feira, 8 de fevereiro de 2013 18:39
  • Manigoldo... eu tõ quase saindo do trabalho :3 vou postar um exemplo então hoje à noite na MSDN Gallery.

    Mas não é dificil, só você cadastrar as connectionstring no webconfig e chamalas NA INSTANCIA do seu contexto.

    Para eu criar o exemplo: você vai usar em web ou desktop? É C# ou VB? Qual versão do EF?

    até mais o/


    Twitter: @MayogaX
    Blog: Dev Blog

    sexta-feira, 8 de fevereiro de 2013 18:57
  • Mais um Help, vamos supor que irei trabalhar com N bancos , todavia será necessário criar uma  nova conexao ? 

    Obrigado.


    • Editado _Manigold_ sábado, 9 de fevereiro de 2013 11:42
    sexta-feira, 8 de fevereiro de 2013 18:57
  • asp.net c#.

    tks

    sexta-feira, 8 de fevereiro de 2013 19:00
  • Model?

    Me explica: tu tá usando code first, model first ou database first?


    Twitter: @MayogaX
    Blog: Dev Blog

    sexta-feira, 8 de fevereiro de 2013 19:55
  • ola priscila pode ser um exemplos mais simples possivel. tks.
    domingo, 10 de fevereiro de 2013 15:36
  • ola priscila pode ser um exemplo mais simples possivel . tks
    domingo, 10 de fevereiro de 2013 15:37
  • Vou tentar ajudar.

    Olha cara, vou assumir que você está fazendo uma Web Application com E.F Code First. Localize o seu arquivo Web.Config, e certifique-se que em "connectionString" você tenha suas duas connectionStrings:

    <configuration>
    ...
      <connectionStrings>
        <add name="UchihaItachi" connectionString="Data Source=SERVER2\ITACHI;Initial Catalog=Itachi;User Id=master;Password=lolwtfbbq;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
        <add name="UzumakiNaruto" connectionString="Data Source=SERVER2\NARUTO;Initial Catalog=Naruto;User Id=master;Password=lolwtfbbq;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
      </connectionStrings>  
    ...
    </configuration>

    Repare que uma chama UchihaItachi e a outra UzumakiNaruto, cada uma delas representam banco de dados diferentes... 

    Agora é o seguinte, você tem uma classe para cada banco, ou quer usar a mesma classe nos dois bancos? Se sua opção for a segunda, os dois bancos tem que ser idênticos. Quando você for instanciar o objeto que irá conter as informações de seu banco você muda o parâmetro do construtor. Exemplo:

    SeuBanco banco = new SeuBanco("UchihaItachi"); //apontando para o banco 1.
    
    SeuBanco banco2 = new SeuBanco("UzumakiNaruto"); //apontando para o banco 2.


    Ao infinito e além!

    • Sugerido como Resposta Afonso Fernandes quarta-feira, 13 de fevereiro de 2013 00:49
    segunda-feira, 11 de fevereiro de 2013 14:00
  • Ola Fabio,na verdade vai ser a segunda opção.

    Seria possivel vc codificar um exemplo na hora que for escolher o banco ?

    Cara muito obrigado.

    terça-feira, 12 de fevereiro de 2013 23:50
  • Então, você tem 1 classe pra dois bancos diferentes, quando você "instanciar" o objeto, passe entre parâmetros o nome da connectionstring.

    Vamos supor que você quer usar o banco 1:

    SuaClasse banco = new SuaClasse("Banco1"); //apontando para o banco 1.

    //utilize o objeto, insira, selecione, etc.

    Agora, você quer usar o banco 2:

    SuaClasse banco = new SuaClasse("Banco2"); //apontando para o banco 22.
    
    //utilize o objeto, insira, selecione, etc.

    É isso que você quer? Se não for, explique de novo para eu entender melhor


    Ao infinito e além!

    quarta-feira, 13 de fevereiro de 2013 00:10
  • Olá Fabio consegui fazer seguindo um exemplo , e o que vc havia me falado logo acima.

    Ficou legal. 

    Mas imagine a seguinte situação: Se eu tiver 1 milhão de de clientes cada um com sua base, será que a unica solução é colocar todas as conexões no web.config ?

    Será que existe uma outra solução ?

    Novamente.

    Obrigado.

    • Editado _Manigold_ quarta-feira, 13 de fevereiro de 2013 02:55
    quarta-feira, 13 de fevereiro de 2013 00:56
  • Opa, desuclpa, acabei nem fazendo seu exemplo, pois fiquei doente >_<

    mas enfim, seria do jeito que o Fábio falou... mas no seu caso poderia ser diferente: vocêpoderia ter uma conection string diferente para cada usuário salvo no banco. Assim só buscar a conection e substituir


    Twitter: @MayogaX
    Blog: Dev Blog

    quarta-feira, 13 de fevereiro de 2013 10:08
  • Olá Priscila , é exatamente isso que vou fazer, mas não sei aonde  manipular a conexão.

    Será que é possível adicionar uma nova conexão em tempo de execução no web.config ?

    ou existe uma outra forma ?

    Obrigado e melhoras.

    quarta-feira, 13 de fevereiro de 2013 11:56
  • Olá Priscila , é exatamente isso que vou fazer, mas não sei aonde  manipular a conexão.

    Será que é possível adicionar uma nova conexão em tempo de execução no web.config ?

    ou existe uma outra forma ?

    Obrigado e melhoras.

    Obrigada pelo "melhoras". Estou melhor sim,é que em São Paulo o tempo mudou na quinta, e isso não é bom.

    Enfim, você pode pegar a conectionstring do banco em forma de string e passar para o contexto como string, não precisando assim estar na web config.

    Apesar de que há como colocar conextionsstrigns em tempo de execução, mas nesse caso nem precisa.


    Twitter: @MayogaX
    Blog: Dev Blog

    quarta-feira, 13 de fevereiro de 2013 12:15
  • Priscila não querendo abusar, existe a possibilidade de  um example ?

    srrsr

    Obrigado novamente.

    quarta-feira, 13 de fevereiro de 2013 12:29
  • Bem, aqui está um exemplo: só baixar o exemplo que se chama Dinamic-ConectionString:

    https://github.com/MayogaX/Entity-Framework-Laboratory/tree/master/Dinamic-ConnectionString

    meio que é simples: eu guardo qual a connection usada na Session. Se precisar de mais explicações me avise


    Twitter: @MayogaX
    Blog: Dev Blog

    • Marcado como Resposta _Manigold_ quinta-feira, 21 de fevereiro de 2013 01:55
    quarta-feira, 13 de fevereiro de 2013 19:01
  • Ola Priscila, achei interessante vc fez em MVC, mas o problema é não uso o mesmo.

    Eu fiz da seguinte forma mas como havia mencionado antes tive que add no web.config:

                    

                using (Banco_1Entities _bd = new Banco_1Entities("minhaconexao"))
                {

                    var query = (from c in _bd.Cliente select c);

                    foreach (var item in query)
                    {

                        string x = item.nome;

                    }

                }

    Em meu Model.Contex fiz a seguinte forma:

        public partial class Banco_1Entities : DbContext
        {
            public Banco_1Entities(string con)
                : base(con)
            {
            }
        
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
               throw new UnintentionalCodeFirstException();
            }
        
            public DbSet<Cliente> Cliente { get; set; }
        }

    Muito obrigado.

    quarta-feira, 13 de fevereiro de 2013 23:05
  • >_<

    não é melhor então você ter as strings de conecção normalmente na web.config? São tantas assim?


    Twitter: @MayogaX
    Blog: Dev Blog

    quinta-feira, 14 de fevereiro de 2013 10:41
  • Na verdade eu acho mais facil, sem sombra de duvidas,mas imagina uma aplicacao com 1.000 clientes.

    fica chato meio Noob fazer dessa forma srrssr.

    obrigado.

    quinta-feira, 14 de fevereiro de 2013 11:07
  • Olha cara, ou você armazena as strings de conexão no Web.Config ou no Banco de Dados, ou em algum arquivo texto, a questão é, você não vai conseguir fugir disso. Você tem que armazena-la em algum lugar, relacionando-a com o identificador do cliente. É possível mudar o Web.Config em tempo de execução, mas eu não curto muito não, sendo assim já que são "muitas", eu guardaria no banco.

    E tipo, de uma olhada nessa sua aplicação ai, pois a não ser que você esteja "vendendo" banco de dados, acho que não existe a necessidade de 1 banco por cliente. As vezes você pode usar um banco só, estruturando ele de uma forma que resolva o seu problema. Lembrando também, que os serviços de hospedagem de site, normalmente cobram por banco de dados, imagina se você tiver 1000 clientes, terá que ter 1000 banco de dados, logo, terá que pagar 1000 banco de dados pro serviço de hospedagem (a não ser que você hospede na sua casa HU3HU3). Agora e se você tiver 1000 clientes, e tiver que pagar apenas 1 banco de dados pro serviço de hospedagem? Olha quanto dinheiro iria sobrar de lucro... bem mais legal agora não?  

     

    Ao infinito e além!

    quinta-feira, 14 de fevereiro de 2013 11:58
  • kkkkkkkkk, gostei da observação Fabio, mas infelizmente é essa a logica , pois sao processos juridicos nao posso nem pensar em fazer na mesma base.

    Mas se vc tiver um exemplo de como mudar a conexao em tempo de execucao, fico agradecido.

    Obrigado novamente.

    quinta-feira, 14 de fevereiro de 2013 13:52
  • Este processo de mudar a string de conexão do context ocorre em tempo de execução, você faz isto quando for instanciar o objeto...

    Vou copiar o que a Priscila fez, só pra facilitar para você...

    Quando o usuário logar selecione a ConnectionString dele em uma variável Session:

     MyConnectionString MyCs = new MyConnectionString();
     MyCs.ConnectionString = "escolha aqui uma connection string ou busque do banco";
     Session["MyConnectionString"] = MyCs;

    Daí sempre que for instanciar o banco, você chama a Session:

     MyDbContex db = new MyDbContex(((MyConnectionString)Session["MyConnectionString"]).ConnectionString);

    Pronto, você estará "mudando" a connection string em tempo de execução. Se eu não me engano a Session perde seu valor se o usuário não fizer nenhuma requisição no servidor por determinado tempo, sendo assim, mandar um if is null antes de instanciar, verificando se a session está preenchida é sempre bom :)


    Ao infinito e além!



    • Editado Fabio R. Luz quinta-feira, 14 de fevereiro de 2013 16:13
    • Sugerido como Resposta Priscila Mayumi Sato sexta-feira, 15 de fevereiro de 2013 18:01
    • Marcado como Resposta _Manigold_ quinta-feira, 21 de fevereiro de 2013 01:55
    quinta-feira, 14 de fevereiro de 2013 16:11