Na seção NHibernate - Macoratti.net você vai encontrar muitos artigos que eu já escrevi mostrando como usar os
recursos do NHibernate.
Se você já chegou a usar o NHibernate e não conhece o Fluent NHibernate, deve saber que gerar os arquivos de
mapeamento (.hbm) dá muito trabalho e é uma tarefa que esta sujeita a erros.
Assim, se esse era um quesito que o desmotivava a usar o NHibernate, fique sabendo que agora você não tem mais
essa desculpa.
O Fluent NHibernate chegou (a um bom tempo por sinal) para auxiliar a realização dos mapeamentos das suas
entidades com o seu banco de dados. Com ele podemos realizar o mapeamento via código sem ter que usar os
arquivos .hbm.
Dessa forma o Fluent NHibernate oferece uma alternativa aos arquivos de mapeamento XML padrão do
NHibernate. Ao invés de escrever documentos XML (arquivos .hbm.xml), o Fluent NHibernate permite que você
escreva mapeamentos fortemente tipados usando código C# ou VB .NET.
Isso permite um fácil refatoramento, melhora a legibilidade e o código fica mais conciso.
Apenas para comparar veja abaixo um exemplo de um arquivo de mapeamento .hbm gerado, e, sua contrapartida
usando o Fluent NHibernate:
(fonte: https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2" public class CatMap : ClassMap<Cat>
namespace="QuickStart" {
assembly="QuickStart"> public CatMap()
<class name="Cat" table="Cat"> {
<id name="Id"> Id(x => x.Id);
<generator class="identity" /> Map(x => x.Name)
</id> .Length(16)
<property name="Name"> .Not.Nullable();
<column name="Name" length="16" not - Map(x => x.Sex);
null="true" /> References(x => x.Mate);
</property> HasMany(x => x.Kittens);
<property name="Sex" /> }
<many-to-one name="Mate" /> }
<bag name="Kittens">
<key column="mother_id" />
<one-to-many class="Cat" />
</bag>
</class>
</hibernate-mapping>
O Fluent NHibernate pode ser baixado no seguinte link: http://www.fluentnhibernate.org/ ou se preferir via Nuget.
Neste artigo eu vou criar um projeto ASP .NET MVC (linguagem C#), e, usar o NHibernate e o Fluent NHibernate
para definir as classes POCO do mapeamento via código para criar as tabelas em tempo de execução no SQL Server
2012.
Recursos usados
Objetivos
Usar os recursos do NHibernate e Fluent NHibernate realizar o CRUD em uma aplicação ASP .NET MVC
Aprendizado
A seguir selecione Visual C# -> Web -> ASP .NET Web Application;
Aproveite para incluir alguns dados na tabela alunos para efeito de testes.
Agora vamos criar na pasta Models do projeto a nossa classe de domínio que é uma classe POCO que
representa um aluno.
Clique com o botão direito sobre a pasta Models e a seguir em Add Class, informe nome Aluno e digite o
código abaixo para a classe Aluno:
Vamos criar agora a nossa classe de mapeamento usando o FluentNHibernate que mapeará a nossa
classe de modelo(Aluno) para a tabela Alunos do banco dados.
Clique com o botão direito sobre a pasta Models e a seguir em Add Class, informe nome AlunoMap e
digite o código abaixo para a classe:
using FluentNHibernate.Mapping;
namespace Crud_FluentNHibernate.Models
{
class AlunoMap : ClassMap<Aluno>
{
public AlunoMap()
{
Id(x => x.Id);
Map(x => x.Nome);
Map(x => x.Email);
Map(x => x.Curso);
Map(x => x.Sexo);
Table("Alunos");
}
}
}
Neste código mapeamos as propriedades definidas na classe Aluno para os campos da tabela Alunos
definida na propriedade Table do Fluente NHibernate.
Usamos aqui as expressões lambdas que são funções podem conter expressões e declarações que são
usadas para criar delegates e árvores de expressões onde o tipo das variáveis não precisam ser declarados
visto que elas usam métodos anônimos.
Para saber mais sobre expressões lambdas veja o meu artigo: .NET - Expressões Lambdas
Vamos agora criar a classe NHibernateHelper que irá realizar a conexão com o banco de dados SQL
Server.
Clique com o botão direito sobre a pasta Models e a seguir em Add Class, informe nome
NHibernateHelper e digite o código abaixo para a classe:
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
namespace Crud_FluentNHibernate.Models
{
public class NHibernateHelper
{
public static ISession OpenSession()
{
ISessionFactory sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(@"Data Source=(localDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True ")
.ShowSql()
)
.Mappings(m =>
m.FluentMappings
.AddFromAssemblyOf<Aluno>())
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(false, false))
.BuildSessionFactory();
return sessionFactory.OpenSession();
}
}
}
No código acima criamos o método OpenSession que será responsável por disponibilizar uma session que
representa o nosso contexto. Nesta classe temos a string de conexão com o banco de dados Cadastro.mdf
do SQL Server 2012.
Na primeira parte do artigo criamos o projeto, definimos a fonte e o modelo de dados, realizamos o mapeamento
Vamos agora definir o controlador e os métodos para realizar o CRUD no projeto ASP .NET MVC 5.
Recursos usados
Visual Studio 2015 Community
Linguagem C#
NHibernate 4.0
Fluent NHibernate
SQL Server 2012 Express
Objetivos
Aprendizado
Clique com o botão direito sobre a pasta Controllers e a seguir em Add -> Controller;
Nossa próxima tarefa será definir cada um desses métodos. Vamos lá...
Após a criação de cada view eu vou fazer alguns ajustes traduzindo para o português alguns títulos e
cabeçalhos.
using NHibernate;
using NHibernate.Linq;
using System.Linq;
using System.Web.Mvc;
Para criar a respectiva view clique com o botão direito no interior do método selecione Add View;
Eu vou fazer alguns ajustes no arquivo de _Layout traduzindo alguns textos para o português.
Para criar a respectiva view clique com o botão direito no interior do método selecione Add View;
// GET: Home/Edit/5
public ActionResult Edit(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var aluno = session.Get<Aluno>(id);
return View(aluno);
}
}
2- Após informar os dados a serem alterados precisamos definir o código do método Edit(POST) abaixo
que irá submeter e salvar as alterações:
// POST: Home/Edit/5
[HttpPost]
public ActionResult Edit(int id, Aluno aluno)
{
try
{
using (ISession session = NHibernateHelper.OpenSession())
{
var alunoAlterado = session.Get<Aluno>(id);
alunoAlterado .Sexo = aluno.Sexo;
alunoAlterado .Curso = aluno.Curso;
alunoAlterado .Email = aluno.Email;
alunoAlterado .Nome = aluno.Nome;
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(alunoAlterado);
transaction.Commit();
}
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Para criar a respectiva view clique com o botão direito no interior do método Edit(GET) selecione Add
View;
// GET: Home/Delete/5
public ActionResult Delete(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var aluno = session.Get<Aluno>(id);
return View(aluno);
}
}
Este código localiza o aluno pelo seu id e apresenta ao usuário para confirmar a exclusão.
Para excluir os dados temos que incluir o código abaixo no método Delete(POST) :
// POST: Home/Delete/5
[HttpPost]
public ActionResult Delete(int id, Aluno aluno)
{
try
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(aluno);
transaction.Commit();
}
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Para criar a respectiva view clique com o botão direito no interior do método Delete(GET) selecione Add
View;
Dessa forma acabamos de criar uma aplicação ASP .NET MVC realizando um CRUD básico com os recursos
do NHibernate e Fluent NHibernate.
Referências:
Seção VB .NET do Site Macoratti.net
Super DVD .NET - A sua porta de entrada na plataforma .NET
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Seção C# do site Macoratti.net
Seção ASP .NET do site Macoratti .net
Curso Básico VB .NET - Vídeo Aulas
Curso C# Básico - Vídeo Aulas
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Macoratti .net | Facebook
macoratti - YouTube
Jose C Macoratti (@macorati) | Twitter
NHibernate - Macoratti.net
.NET - Apresentando o padrão Repository - Macoratti.net
VB .NET - Implementando o padrão Repository - Macoratti.net
VB .NET - Usando o NHibernate - Macoratti.net
NHibernate - Usando o ActiveRecord - Macoratti.net
ASP .NET - Usando o NHibernate II - Macoratti.net