Instalando Entity Framework provider para Oracle no Visual Studio 2010

julho 15, 2010 2 comentários

Antes de começar a instalação faça o download dos seguintes componentes:

Instalando o provider:

  1. Instale o ODAC

  2. Descompacte o arquivo EFOracleOdpProvider-0.10-source.zip

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

  4. 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)"
  5. 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.

  6. Agora abra o arquivo

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\config\machine.config
  7. 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

maio 26, 2010 2 comentários

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.

Categorias.NET Tags:,

Aonde foi parar o Global Assembly Cache no .NET Framework 4?

maio 13, 2010 3 comentários

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 de novas possibilidadesO 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

CategoriasUncategorized
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.