NHibernate - Usando o ActiveRecord III (Migrando para o MySQL)


Na primeira parte deste artigo eu apresentei o ActiveRecord e depois mostrei uma exemplo prático de sua utilização com o NHibernate mostrando como ficou fácil gerar os arquivos de mapeamento XML.

Neste artigo eu vou mostrar mais uma característica do NHibernate e que na verdade é um dos principais motivos para sua utilização: a portabilidade da sua aplicação para outro gerenciador de banco de dados. Para ilustrar o exemplo eu vou pintar um cenário hipotético abusando das ilustrações.

Imagine que você esta trabalhando como programador ou programador analista ou programanalista em uma empresa na qual desenvolveu o sistema que atualmente esta em uso.

Agora imagine que em uma sexta-feira você chega no serviço todo contente , afinal é sexta-feira, e logo ao chegar você é avisado que o seu chefe deseja falar com você com urgência.

Na sala do chefe você recebe a fatídica notícia : Por um problema com o fornecedor, o contrato para utilização do banco de dados que a empresa esta usando não será renovado, e, ele deverá ser trocado com máxima urgência até segunda-feira (Estamos na sexta lembre-se ? ). Você esta recebendo a notícia somente a 3 dias de ter a nova versão do banco de dados em produção, pois havia uma expectativa de renovação que não se concretizou.

Resumindo: O pepino (como sempre) sobrou para a área de TI.

Ao ouvir tal notícia você tentou argumentar que deveria ter sido avisado com antecedência mas para resumir não teve jeito, e, você vai ter que trocar o banco de dados atual da sua aplicação por um banco de dados open source e o escolhido foi o MySQL.

Você terá que criar o banco de dados, as tabelas e importar os dados, mas, esse não é o maior problema.O problema é que você vai ter que mudar toda a sua aplicação para acessar outro banco de dados, e, isso em 3 dias, considerando que você vai ter que trabalhar sexta, sábado e domingo para que o sistema esteja no ar na segunda feira usando o novo banco de dados.

Neste momento você pode ter duas reações, dependendo de como o seu projeto atual foi desenvolvido:

1- O seu projeto foi desenvolvido sem qualquer organização e é composto por centenas de formulários onde se misturam regras de negócio, lógica de acesso a dados e código para apresentação.

Neste cenário você vai ficar muito bravo , pois você vai ter que ralar no final de semana, alterar milhares de linhas de código , trabalhando direto para fazer a migração da aplicação para usar o novo banco de dados MySQL sem saber se ao final as coisas vão funcionar pois não terá tempo de testar.

"Por que eu não segui o conselho do Macoratti e não adotei as boas práticas como uma arquitetura em camadas, padrões de projeto e os recursos da orientação a objetos ? "

2- O seu projeto foi desenvolvido com base nas boas práticas de programação usando uma arquitetura em camadas, padrões de projeto e para melhorar a situação você usou o NHibernate e ActiveRecord na sua camada de acesso a dados pois já prévia que poderia haver uma mudança no gerenciador de banco de dados que a empresa estava usando.

Neste cenário você sente que chegou o momento de mostrar a sua competência, pois vai conseguir efetuar a migração com pouco esforço. Na verdade você nem vai ter que trabalhar no final de semana pois o trabalho será apenas criar o banco de dados e as tabelas com a mesma estrutura no MySQL e na sua aplicação você vai ter que apenas criar um novo arquivo de configuração sem ter que mexer no código.

"Ainda bem que eu segui o conselho do Macoratti e adotei as boas práticas usando uma arquitetura em camadas, padrões de projeto e os recursos da orientação a objetos."

Embora o cenário possa ser hipotético (e um tanto exagerado) ele não é impossível de acontecer, e, como desenvolvedores devemos estar sempre preparados para  contornar os problemas que com certeza iremos encontrar na profissão.

Para ilustrar como é simples efetuar a migração de um banco de dados para outro quando se usa o NHibernate eu vou usar o exemplo já abordado na segunda parte deste artigo onde usamos banco de dados SQL Server e vou migrar a aplicação para usar o MySQL.

A primeira coisa a fazer é criar o banco de dados e as tabelas no MySQL. Abaixo temos a estrutura do banco de dados SQL Server e das tabelas usadas pela aplicação:

Temos que ter o cuidado na criação do banco de dados e das tabelas pois devemos manter a mesma estrutura e os mesmos tipos de dados usados pela aplicação.

Usando o MySQL Administrator vemos abaixo o novo banco de dados Clientes e a tabela a nova Contatos criada no MySQL:

Após migrar os dados (veja nas referências) vamos fazer a alteração na aplicação para acessar o novo banco de dados e as tabelas no MySQL.

Será que teremos que alterar alguma linha de código ? Não , iremos mudar só o arquivo de configuração.

Para isso basta alterar o arquivo AppConfig.xml conforme abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<activerecord>
  <config>
    <add
        key="connection.driver_class"
        value="NHibernate.Driver.MySqlDataDriver" />
    <add
        key="dialect"
        value="NHibernate.Dialect.MySQLDialect" />
    <add
        key="connection.provider"
        value="NHibernate.Connection.DriverConnectionProvider" />
    <add
        key="connection.connection_string"
        value="Server=localhost;Database=clientes;User ID=root;Password=xxxxxx" />
    <add
        key="proxyfactory.factory_class"
        value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle"  />
    <add
        key="hbm2ddl.keywords" value="none" />
  </config>
</activerecord>

Observe que alteramos as informações referentes ao banco de dados usado como : driver de conexão, dialeto, string de conexão, etc.

Conseguimos assim portar uma aplicação que usava um banco de dados SQL Server para usar um banco de dados MySQL sem ter que mudar uma única linha de código, mexer em uma única regra de negócio.

Fazendo apenas esta alteração já podemos rodar a aplicação e verificar o seu funcionamento:

Você aproveitou um momento de crise , mostrou a sua competência e no final da sexta-feira teve mais um motivo para comemorar...

Tudo isso graças ao NHibernate e ao ActiveRecord.

Pegue o projeto completo aqui:   NHibernateActiveRecordDemoMySQL.zip (sem as dlls das referências)

Eu sei é apenas NHibernate, mas eu gosto...

Referências:


José Carlos Macoratti