Instalando Entity Framework provider para Oracle no Visual Studio 2010
Antes de começar a instalação faça o download dos seguintes componentes:
- Oracle 11g Release 2 ODAC 11.2.0.1.2 with Oracle Developer Tools for Visual Studio
- Entity Framework Oracle ODP.net Provider – EFOracleOdpProvider
Instalando o provider:
-
Instale o ODAC
-
Descompacte o arquivo EFOracleOdpProvider-0.10-source.zip
-
Inicie uma instância do Visual Studio 2010 como administrador e abra o projeto do provider, o vs2010 abrirá o assistente de conversão de projetos. Converta o projeto para o formato do VS2010.
-
Após o projeto ser convertido, abra a janela de propriedades do projeto (clique com o botão direito do mouse sobre o projeto no Solution Explorer e selecione Properties). Na aba “Build Events”, clique no botão “Edit Post-build…” e substitua o comando de instalação do assembly no GAC do .NET Framework 2.0 para o comando de instalação do assembly no GAC do .NET Framework 4.0.
"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe" /if "$(TargetPath)"
-
Feche a janela de propriedades do projeto e compile o projeto. O assembly gerado será instado automaticamente por causa do que fizemos no item 3.
-
Agora abra o arquivo
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\config\machine.config
-
Localize a sessão <DbProviderFactories> e adicione uma entrada para EFOracleOdpProvider
<add name="EF Oracle Odp Provider" invariant="EFOracleOdpProvider" description="EF Provider for Oracle" type="EFOracleOdpProvider.EFOracleOdpProviderFactory, EFOracleOdpProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6ad3e818a7c6d2a"/>
Feito isto o provider já está disponível para ser utilizado com o Entity Framework. Contudo, alguns passos adicionais são necessários para efetivamente utilizar o provider no seu código. Mostrarei como fazer isto no próximo post.
Inicializadores de coleções
Ontem, o Leonardo, estagiário da equipe na qual trabalho, fez uma pergunta muito interessante a respeito da inicialização da classe Dictionary<TKey, TValue>. Na verdade, ele fez uma constatação, não uma pergunta. Ele me mostrou um bloco semelhante ao seguinte código
Dictionary<string, string> propriedades = new Dictionary<string, string>() { { "Nome", "Carlos Loth" }, { "Idade", "26 anos" } }
E comentou que, inicialmente, estava tentando inicializar uma instância da class Dictionary utilizando novas instâncias da estrutura KeyValuePair<TKey, TValue> e esta abordagem não estava funcionando. Mudando um pouco o exemplo inicial, o código que ele tinha escrito inicialmente era mais ou menos assim
Dictionary<string, string> propriedades = new Dictionary<string, string>() { new KeyValuePair<string, string>("Nome", "Carlos Loth"), new KeyValuePair<string, string>("Idade", "26 anos") }
Contudo, quanto tentava compilar este código, acontecia um erro: a classe Dictionary<TKey, TValue> não possui uma sobrecarga do método Add que receba apenas um argumento.
Eu fiquei intrigado com isto, pois a princípio eu achei que o código da primeira listagem nem fosse compilar. Mas, de fato, ele está correto. A especificação da linguagem C# 4.0, diz, na seção 7.6.10.3 Collection Initializers, que uma expressão de inicialização de coleções chama o método Add no objeto de destino para cada um dos elementos da de inicialização na ordem que foram especificados. Além disto, a lista na expressão de inicialização de cada elemento é passada como argumento do método Add. Sendo assim, o objeto coleção deve possuir um método Add aplicável para cada inicializador de elemento para que o uso desta sintaxe seja possível.
Portanto, como a classe Dictionary tem apenas um método Add(TKey key, TValue value) é por isto que a primeira lista de código é válida e a segunda não. Além disto, a especificação também mostra um exemplo do código que a expressão de inicialização de coleções gera, que adaptando ao meu exemplo seria
Dictionary<string, string> __cdict = new Dictionary<String, String>(); __cdict.Add("Nome", "Carlos Loth"); __clist.Add("Idade", "26 anos"); Dictionary<string, string> propriedades = __cdict;
Onde __cdict é uma variável intermediária que não é visível nem acessível ao programador do código que utiliza a sintaxe de inicialização.
Eu utilizo bastante a sintaxe de inicialização para objetos e arrays, mas confesso que nunca tinha utilizado para coleções mais sofisticadas como a classe Dictionary. Agora aprendi os detalhes de como ela funciona para coleções.
Leonardo, muito obrigado por compartilhar esta dica e instigar a discussão na nossa equipe.
Aonde foi parar o Global Assembly Cache no .NET Framework 4?
Uma das primeiras coisas que você pode acabar se perguntando quando começa a trabalhar com o Visual Studio 2010 e o .NET Framework 4.0, é o seguinte “aonde foi parar o assembly que eu acabei de registrar no GAC?”.
Ontem, após muita tentativa-e-erro, acabei descobrindo que o GAC no .NET Framework 4.0 sofreu algumas alterações. Ele foi dividido em dois, um GAC para cada versão do Common Language Runtime (CLR).
A versão do CLR utilizada pelo .NET Framework 2.0 e pelo .NET Framework 3.5 é CLR v2.0. Portanto, os assemblies compilados com as versões 2.0 e 3.5 do .NET Framework ficam no mesmo GAC, localizado na pasta
%systemroot%\asseembly
Já os assemblies compilados com o .NET Framework 4.0 utilizam o CLR v4.0. Sendo assim, ficam no novo GAC, localizado na pasta
%systemroot%\Microsoft.NET\assembly
A primeira coisa que você irá notar é que o GAC do CLR v4.0 não usa a extensão do Windows Shell (shfusion.dll) que permitia visualizar todos os assemblies instalados como uma lista (com nome, versão e public key token). Aparentemente, esta extensão foi descontinuada, veja o segundo comentário neste post do site Microsoft Connect.
A Microsoft decidiu isolar o GAC desta nova versão da CLR para que as aplicações que utilizam o CLR v2.0 não consigam enxergar os assemblies desenvolvidos com o CLR v4.0.
Escolhendo um provider para acessar o Oracle com Entity Framework
Uma das tarefas que minha equipe terá que realizar este ano será a migração da nossa base de dados de SQL Server para Oracle. No ano passado, uma parte significativa da aplicação foi reescrita utilizando o Entity Framework, sendo assim, decidimos começar a tarefa de migração com uma prova de conceito (PoC), utilizando o Entity Framework para acessar o Oracle.
A grande maioria dos providers disponíveis para Oracle são pagos. Mesmo assim existem algumas implementações de exemplo no site CodePlex. Basicamente, estes providers utilizam duas abordagens diferentes para acessar o banco Oracle:
- System.Data.OracleClient – utiliza as classes do ADO.NET, disponibilizadas com o .NET Framework
- Oracle.DataAccess – utiliza as classes do ODP.NET, parte do Oracle Data Access Componets (ODAC)
Optamos pela segunda abordagem, pois o time do ADO.NET anunciou que o desenvolvimento das classes no namespace System.Data.OracleClient será descontinuado. O provider que escolhemos foi Entity Framework Oracle ODP.net Provider.
No próximo post, mostrarei como instalar este provider utilizando o Visual Studio 2010 e o .NET Framework 4.0.
O nascer de novas possibilidades
O nascer do sol no horizonte é um símbolo de renovação mas também remete ao passado. Ele sinaliza o despertar de um novo dia, de uma nova energia e de novas possibilidades, assim como nos faz lembrar que somos fruto das descobertas e experiências que vivenciamos após os muitos outros nascimentos que o precederam.
Neste espírito, inspirado pelo amigo João Paulo Bochi e motivado pelo amigo Rodrigo Kono, estou começando este novo projeto, meu blog pessoal.
Aqui pretendo compartilhar o meu trabalho e minhas idéias, mas principalmente aprender e contribuir com a comunidade.
Foto de Luis Argerich