Usuário com melhor resposta
Mudar Conexão E.F

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.
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
- Marcado como Resposta _Manigold_ quinta-feira, 21 de fevereiro de 2013 01:55
-
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
Todas as Respostas
-
- Sugerido como Resposta Afonso Fernandes sexta-feira, 8 de fevereiro de 2013 18:44
-
-
-
-
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/
-
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
-
-
-
-
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
-
-
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!
-
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
-
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
-
-
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.
-
-
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
- Marcado como Resposta _Manigold_ quinta-feira, 21 de fevereiro de 2013 01:55
-
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.
-
-
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!
- Sugerido como Resposta Vinícius Rafael Tavares quinta-feira, 14 de fevereiro de 2013 12:36
-
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.
-
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