Olá,
Hoje vamos falar um pouco sobre o gerenciamento de string de conexões no Entity Framework Code First, uma maneira muito simples e rápida de criar um mapeamento objeto relacional em C# com o Visual Studio 2010.
Se você ainda não conhece o EF CodeFirst, veja este post e também o Blog do time de ADO.Net.
O que vou tratar neste post é como podemos armazenar as strings de conexão e os providers que permitem o acesso do EF ao nosso banco de dados. Por padrão, quando criamos um contexto para nosso EF, é necessário uma string de conexão e um Data Provider, que indica qual o banco de dados será utilizado, mas se criarmos um contexto simples, sem nenhuma string de conexão, como no exemplo abaixo, o que acontece ?
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Data.Entity;
6:
7: namespace EFExemplo
8: {
9: public class ContextoExemplo : DbContext
10: {
11: public DbSet<Cliente> Cliente { get; set; }
12: }
13: }
Como não expecificamos nenhum construtor, o EF tentará usar o servidor .\SQLExpress e tentará criar o banco de dados ContextoExemplo e caso você não tenha este servidor SQL disponível, receberá um erro.
Vamos imaginar que você queira especificar uma string de conexão, neste caso temos várias maneiras de fazer isto e vamos explorar cada uma delas:
Opção 1: Informar a string de conexão no construtor do contexto:
1: public class ContextoExemplo : DbContext
2: {
3: public DbSet<Cliente> Cliente { get; set; }
4:
5: public ContextoExemplo(string conexao) : base(conexao)
6: {
7:
8: }
9: }
Neste caso podemos usar de duas maneiras: você pode informar somente a string de conexão e neste caso poderá usar somente o SQL Server, que é o provider default para o EF. Isto pode ser feito na instância do contexto:
1: static void Main(string[] args)
2: {
3: ContextoExemplo ctx = new ContextoExemplo("data source=(local); initial catalog=EFExemplo; user id=teste; password=teste;");
4: ctx.Database.CreateIfNotExists();
5: }
Neste caso será criado o banco de dados EFExemplo no servidor SQL local.
Opção 2: Informar o noem de uma string armazenada em um arquivo de configuração:
A segunda maneira é você manter a string fora do executável, de maneira que você possa modificá-la a qualquer momento, neste caso usaremos o arquivo de configuração da aplicação (app.config ou web.config):
1: <?xml version="1.0" encoding="utf-8" ?>
2: <configuration>
3: <connectionStrings>
4: <add name="EFExemplo" providerName="System.Data.SqlClient" connectionString="data source=(local); initial catalog=EFExemplo; user id=teste; password=teste;"/>
5: <add name="EFExemplo-MySql" connectionString="Server=localhost;Database=efexemplo;Uid=teste;Pwd=teste;Port=3306;" providerName="MySql.Data.MySqlClient"/>
6: </connectionStrings>
7: </configuration>
No arquivo de configuração podemos agora manter mais de uma string e também informar qual o banco de dados de cada conexão. Para usar a conexão, basta informá-la no construtor:
1: ContextoExemplo ctx = new ContextoExemplo("EFExemplo");
ou
1: ContextoExemplo ctx = new ContextoExemplo("EFExemplo-MySql");
Opção 2: Informar um DbConnection:
DBConnection é a classe que cria as conexões para o EF CodeFirst, neste caso você pode gerar a string de uma maneira mais dinâmica e ela não precisa estar armazenada em um arquivo app.config ou web.config, o que deixaria a string mais exposta. Este mecanismo é interessante quando você quer criptografar a string, veja:
1: public class ContextoExemplo : DbContext
2: {
3: public DbSet<Cliente> Cliente { get; set; }
4:
5: public ContextoExemplo(string conexao) : base(conexao)
6: {
7:
8: }
9:
10: public ContextoExemplo(DbConnection conexao) : base(conexao,true)
11: {
12:
13: }
14: }
Veja que agora temos uma sobrecarga do construtor, onde informamos o DbConnection e vamos fazer isto na instância do contexto:
1: static void Main(string[] args)
2: {
3: DbProviderFactory prov = DbProviderFactories.GetFactory("System.Data.SqlClient");
4: DbConnection conexao = prov.CreateConnection();
5: conexao.ConnectionString = "data source=(local); initial catalog=EFExemplo; user id=teste; password=teste;";
6:
7: ContextoExemplo ctx = new ContextoExemplo(conexao);
8: ctx.Database.CreateIfNotExists();
9: }
Para criarmos a conexão, primeiro precisamos identificar o tipo do banco de dados, através do DbProviderFactory() e logo a seguir, informamos a string de conexão que é depois passada como parâmetro para o contrutor do contexto. Note que a string de conexão poderia vir de um arquivo criptografado ou mesmo de um serviço web, o que aumentaria a segurança da aplicação.
Bem pessoal, espero que este post possa lhes ser útil.
Até breve,
Carlos dos Santos.
CodeFirst parece estar bem evoluído! Agora possui suporte a table functions se não me engano…
Poderia postar alguns exemplos utilizando stored procedures, views e FT!
Estou usando EF faz um ano já, pretendo iniciar um projeto utilizando o code first…
Abraço.
Olá,
Realmente está evoluindo muito e bem rápido. O suporte a TVF existe, mas não ainda no CodeFirst diretamente. Stored Procedures também não são suportadas diretamente, mas é possível utilizá-las. Views você acessa como se fosse um tabela normal, ou seja, faz o mapeamento da classe e pronto.
Vou montar um exemplo de acesso a Stored Proc e faço um post.
Obrigado pelos comentários.
[]s,
Parabens Carlão.
Ficou show de Bola!
Abs.
Adriano Bertucci
Valeu Adriano.
[]s,
Carlos.
Este projeto eh incrivel! Voce certamente sabe como manter um leitor divertido. Entre a sua inteligencia e os seus videos, eu estava quase mudou-se para comecar o meu proprio blog (bem, Estou praticando meu portugues, desculpa por erros na minha escrita
Era exatamente o que eu procurava… mto obrigado
sucesso ….