segunda-feira, 8 de fevereiro de 2010

Criando aplicações utilizando o ActiveRecord e o banco de dados integrado ao VisualStudio 2008


A tempos tenho tantado encontrar uma forma de utilizar o SQL Server Compact Edition Database, banco de dados disponibilizado de forma integrada ao VisualStudio 2008, juntamente com um framework de mapeamento ORM, como o ja comentado NHibernate. Até alguns dias atrás, sem nenhum sucesso, estive pesquisando as melhores formas de se utilizar o NHibernate e encontrei um framework chamado de ActiveRecord, que era muito falado nos sites relacionados ao NHibernate.

O ActiveRecord é um framework que utiliza o NHibernate e seu mapeamento. Ele gerencia grande parte desse processo e provê maneiras mais usuais de utilização do framework. Com ele é possível utilizar-se do mapeamento objeto-relacional sem se preocupar com as sessões do NHibernate, cada classe do modelo pode estender uma classe do ActiveRecord que possibilita uma interação mais fácil e dinâmica sobre o processo, como por exemplo, para salvar um objeto voce apenas chama o método objeto.save(), e muitas outras funcionalidade muito interessantes.

Se voce quer saber mais sobre o ActiveRecord pode acessar seu site e saber mais sobre o framework.

Voltando agora ao assunto, com a utilização do ActiveRecord, após várias tentativas de configuração, consegui criar uma aplicação que utiliza o banco de dados integrado do VisualStudio 2008 juntamente com o ActiveRecord, que por sua vez utiliza o NHibernate e faz toda a mágica de poder criar uma aplicação com um banco gerado em tempo de execução, sem que o programador tenha que se preocupar com a existência deste, com a criação de tabelas e tudo mais.

Quero então neste post mostrar como deve proceder a criação de uma aplicação que utilize o ActiveRecord juntamente com o banco integrado do VisualStudio 2008, volto a repetir o nome completo "VisualStudio 2008", pois não testei em outras versões. Assim iniciamos um novo projeto, aqui estou criando um Windows Forms, mas pode ser outro tipo de projeto:



Agora você vai precisar importar para o projeto as bibliotecas do ActiveRecord e do NHibernate, se você ainda não as possui pode baixar aqui. Dentro do pacote baixado voce vai encontrar várias Dll's, voce deve importar para o seu projeto cinco delas, a Castle.ActiveRecord.dll, log4net.dll, Nhibernate.dll, Iesi.Collections.dll e a Nhibernate.ByteCode.Castle.dll, estas são as dll's necessárias para o funcionamento básico do ActiveRecord.



Também deve ser importada a biblioteca para o funcionamento do SQL Server Compact Edition, ela se encontra dentro das Dll's do framework .NET 3.5, que é instalado juntamente com o VisualStudio 2008. Adicione então ao projeto a biblioteca System.Data.SqlServerCe.dll.



Agora seu projeto ja possui todas as bibliotecas necessárias para o funcionamento da aplicação. Temos somente que alterar a configuração para a Dll System.Data.SqlServerCe.dll, clicando sobrepode-se visualizar suas propriedades, então a propriedade "Copy Local" deve ser alterada para "True", para que quando a aplicação for compilada a Dll seja copiada para a pasta /bin/released. Isso deve ser feito pelo fato de ser esta a Dll que fornece a comunicação com o banco.



Agora deve-se criar a configuração de conexão do ActiveRecord com o banco, para isso adicionamos ao projeto um arquivo xml, que eu vou chamar de configuracao.xml, é ele que irá configurar o ActiveRecord. Este é o código de configuração que o arquivo deve conter:



Olhando o código pode-se ver onde está sendo configurado qual é o banco que será utilizado, neste caso "Data Source=teste.sdf", ou seja, o nome do banco é "teste.sdf", este não precisa ser criado no projeto pois será gerado automaticamente pelo último procedimento mostrado neste post, apenas é importante que ele seja criado com este mesmo nome.

Agora basta criarmos a classe que queremos mapear, neste exemplo, apenas como ilustração eu criei a classe Pessoa, que estende a classe ActiveRecordBase, para que seja possível o acesso aos métodos do ActiveRecord diretamente do objeto criado. Então temos a seguinte classe:



Pode-se perceber o uso dos chamados "Annotations" do ActiveRecord, que são utilizados para configurar o mapeamento da classe dentro do próprio código-fonte. Você pode aprender mais sobre isso lendo a documentação do ActiveRecord, disponibilizada em seu site.

Finalmente, agora basta criarmos a inicialização do ActiveRecord, que deve ser a primeira coisa a ser chamada no início da execução da aplicação. Eu utilizo o seguinte código, que verifica a existência do banco e se por acaso ele não existir este será criado, e inicializa as configurações do ActiveRecord. Para ser chamado antes que a aplicação inicie sua execução eu o coloquei dentro o método Load do Form.



Pronto! Nossa aplicação está pronta. Se você for até o local do projeto, dentro da pasta /bin/debug/ , você pode visualizar o banco criado. Com a ajuda do SQL Server Management Studio pode-se visualizar as tabelas criadas e o conteúdo de cada uma delas.

Agora podemos criar aplicações sem se preocupar com o banco que estaremos utilizando na maquina que irá executar a aplicação, basta apenas ter instalado o framework .NET 3.5 que a aplicação funcionará perfeitamete.

ps: Não é recomendado utilizar este banco quando um número muito grande de registros (mais que 100.000 por tabela) for previsto, para isso deve-se utilizar os bancos convencionais, eu indico o SQL Server 2008.Até o próximo Post.

quarta-feira, 9 de setembro de 2009

Iniciando do Zero: Entendendo o NHibernate

Neste post quero deixar claro como é feita a utilização do NHibernate para que cada objeto da aplicação possa ser mapeado e gerenciado pelo ORM, lembrando que não é apenas a criação do mapeamento, responsabilidade do NHibernate, como também a sua manutenção em tempo de execução, mas isso eu deixarei mais claro em posts futuros. Na sequência construirei um pequeno exemplo, para que possamos vizualizar como tudo deve ser feito.

Consideramos a classe Pessoa, a seguir modelada:


Para quem ainda não está acostumado a utilizar o Visual Studio (eu utilizo o VS 2008 Professional), esse diagrama pode ser feito no próprio visual a partir do código da classe ou não, qualquer mudança na classe é refletida no modelo e qualquer mudança no modelo é refletido no código da classe. Este é o código da classe:

Public Class Pessoa

Private _id As Long
Private _nome As String
Private _cpf As String
Private _endereco As String
Private _telefone As String
Private _dataNascimento As Date

Public Sub New()
End Sub

Public Overridable ReadOnly Property Id() As Long
Get
Return _id
End Get
End Property

Public Overridable Property Nome() As String
Get
Return _nome
End Get
Set(ByVal value As String)
_nome = value
End Set
End Property

Public Overridable Property Cpf() As String
Get
Return _cpf
End Get
Set(ByVal value As String)
_cpf = value
End Set
End Property

Public Overridable Property Endereco() As String
Get
Return _endereco
End Get
Set(ByVal value As String)
_endereco = value
End Set
End Property

Public Overridable Property Telefone() As String
Get
Return _telefone
End Get
Set(ByVal value As String)
_telefone = value
End Set
End Property

Public Overridable Property DataDeNascimento() As Date
Get
Return _dataNascimento
End Get
Set(ByVal value As Date)
_dataNascimento = value
End Set
End Property

End Class

É importante observar a presença da propriedade Id, presente na classe. Esta propriedade é obrigatória para que possa ser realizado o mapeamento objeto relacional. O Id será utilizado pelo NHibernate para um controle interno, nos posts futuros irei explicar o porque disso, por enquanto o importante é saber que o Id sempre deverá ser utilizado.
Agora realizaremos o mapeamento da classe Pessoa para que o NHibernate possa realizar o gerenciamento sobre cada objeto criado pela classe, tomando toda a responsabilidade de comunicação com o banco de dados e persistência no mesmo. Para que isso seja possível é necessário a criação de um documento XML (eXtensible Markup Language), este documento servirá de base para o NHibernate compreender como é estruturado o objeto que deverá ser mapeado. Este processo de criação do XML é geralmente chamado de mapeamento pelos programadores.
Cada uma das propriedades de uma classe deve ser mapeada, assim como a própria classe. A declaração do mapeamento de cada um destes é feito por uma tag XML, para as propriedades utiliza-se a tag property, e para a classe a tag . Assim construimos o seguinte documento XML para o mapeamento da classe Pessoa:



Está em imagem porque não consegui publicar o texto XML aqui no Blog, mais tarde concertarei isso.

É interessante verificar que o Id tem uma tag própria de declaração, e dentro deste há a tag que define como será a geração do número do Id. Na documentação do NHibernate pode-se encontrar mais coisas sobre o generator, o "native" presente no mapeamento, utiliza a geração de Id configurada no bando de dados que está sendo usado.

Descrevendo os atributos utilizados na declaração da classe:
name: são na verdade dois nomes. Oprimeiro é o nome completo da classe, nesse caso, como criei uma nova aplicação e o nome que dei a solution foi "Exemplo", o nome completo da classe Pessoa é "Exemplo.Pessoa". O segundo nome é o nome do assembly da aplicação, que é o mesmo que foi dado a solution "Exemplo" .
table: é o nome que será atribuído a tabela criada no banco.

Descrevendo os atributos utilizados no mapeamento das propriedades:
name: deve ser o exato nome da propriedade que está sendo mapeada.
column: é o nome que será atribuído a coluna criada na tabela.
type: é o tipo da propriedade, este deve ser exatamente o mesmo tipo declarado na propriedade. not-null: define na tabela do banco se a propriedade pode ou não ser nula.
length: define o tamanho máximo declarado na coluna da tabela, somente em propriedades do tipo texto (String, char.. etc).
unique: cria uma chave única para a coluna da tabela, referente a propriedade mapeada.
access: Utilizado no mapeamento do Id. Também pode ser utilizado em qualquer outra propriedade. Define como será o acesso a propriedade, como abrigatóriamente o Id só pode ser lido (readOnly) é definido o acesso "nosetter.camelcase-underscore" e utilizado o readOnly na declaração do código da propriedade.
A ordem em que esses atributos são escritos não interferem no funcionamento. Há ainda outros atributos, que serão abordados futuramente, novamente cito que na documentação do NHibernate pode-se conferir todos os atributos que podem ser utilizados.
Acho que esse é um importante começo no uso do NHibernate, entender como é a sua utilização. mas para que possamos utilizar devemos saber como configurar o NHibernate, juntamente com o banco de dados. Essas informações vem juntamente com o NHibernate, quando é feito seu download pode-se conferir na pasta Core\Configuration_Templates as configurações para cada tipo de banco. Mais tarde abordarei este assunto aqui também, mostrando passo a passo como fazer uma pequena aplicação utilizando o NHibernate.

Até mais...

Documentação do NHibernate: https://www.hibernate.org/343.html

quinta-feira, 3 de setembro de 2009

Falando Sobre o NHibernate

O NHibernate é uma API portada para a plataforma .NET a partir do Hibernate, que funciona em plataforma Java. A utilização do NHibernate e do Hibernate é similar, então se alguém ja estiver habituado a utilização de algum destes, não sentirá dificuldades.
O NHibernate é um ORM (Object Relational Management), traduzindo, ele é um mapeador objeto relacional. Com ele é possível escrever aplicações em linguagens orientadas o objetos e utilizar qualquer banco de dados relacional, sem ser necessário a criação de nenhuma linha de em linguagem SQL para a persistência dos dados no banco. E sim acredite é fácil de usar e não requer muita experiência para a criação de aplicações simples. O melhor na utilização do NHibernate é poder conversar com um banco de dados relacional em linguagem orientada a objetos, ou seja, você salva e recupera objetos, e não linhas de tabela.
A utilização é bem simples, e é utilizado apenas script XML para que tudo possa acontecer. Mas fica fácilexplicar conceitualmente coisas que podem ser vizualizadas. Então minha dica para quem está interessado é acompanhar o blog, pois logo estarei publicando um artigo de como utilizar o NHibernate. Para quem tem pressa basta acessar o site: https://www.hibernate.org/343.html e fazer o download da documentação.
Até Logo...

Desenvolvimento .NET com NHibernate

Blog novo, com muita coisa nova. Estou terminando meu curso de ciência da computação e espero poder ajudar aqui desenvolvedores interessados em desenvolvimento com a plataforma .NET. Atualmente estou trabalhando também com o NHibernate, excelente ferramenta para ser utilizada junto com as linguagens .NET, ja venho utilizando a quase um ano e gostaria de compartilhar meu aprendizado com seu uso, trocar idéias e experiências com todos aqueles que tiverem interesse. Adiante estarei publicando algumas coisas inovadoras que acabei construíndo e alguns artigos exploratórios sobre o mundo .NET e NHibernate.