Usando o Fluent NHibernate

Vamos dar sequência em nossa série sobre Fluent NHibernate

  1. Começando com Fluent NHibernate
  2. Mapeamentos com Fluent NHibernate
  3. Usando o Fluent NHibernate
  4. Gerando arquivos HBM
  5. Gerar arquivo SQL do mapeamento
  6. Configurando Log4NET
  7. Como funciona o Lazy Load

Nessa terceira etapa vamos aprender como usar o Fluent NHibernate fazendo um CRUD com os mapeamentos que fizemos no post anterior

Classe Conexão

Antes de mais nada, vamos criar uma classe para realizar a conexão com o banco que retorna uma sessão para que possamos realizar as tarefas no banco, veja abaixo o código

[sourcecode language=”csharp”]
public class Conexao
{
public static ISessionFactory CreateSessionFactory()
{
FluentConfiguration configuration = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(
x => x.FromConnectionStringWithKey("ConexaoBanco")).ShowSql())
.Mappings(x => x.FluentMappings.AddFromAssemblyOf<Pessoa>());

return configuration.BuildSessionFactory();
}
}
[/sourcecode]

Linha 5: Iniciamos a classe para realizar a configuração

Linha 6: Configuramos o banco

Linha 7: Configuramos a string de conexão que está no arquivo de configuração (web.config, App.config)

Linha 8: Adicionamos o assembly onde está nossas entidades. Não é preciso adicionar todas suas entidades, apenas uma para o Fluent saber em qual assembly buscar as informações

Linha 10: Retornamos uma session

Cadastrar Departamento

Primeiramente vamos cadastrar os departamentos

[sourcecode language=”csharp”]
[TestMethod]
public void Cadastrar_Departamento()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
Departamento _obj1 = new Departamento();
_obj1.Nome = "Diretoria";
_obj1.Descricao = "Departamento diretoria";
_obj1.DataCadastro = DateTime.Now;
session.Save(_obj1);

Departamento _obj2 = new Departamento();
_obj2.Nome = "Comercial";
_obj2.Descricao = "Departamento comercial";
_obj2.DataCadastro = DateTime.Now;
session.Save(_obj2);

transaction.Commit();
}
}
}
[/sourcecode]

Linha 4: Criamos uma conexão com o banco

Linha 6: Abrimos a conexão com o banco

Linha 8: Abrimos uma transação

Linha 10: Criamos um objeto do tipo Departamento

Linha 11: Atribuimos seus valores

Linha 14: Mandamos salvar o objeto

Linha 22: Persistimos as informações no banco

Cadastrar Grupo

Agora vamos cadastrar os Grupos, segue o mesmo padrão descrito acima

[sourcecode language=”csharp”]
[TestMethod]
public void Cadastrar_Grupo()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
Grupo _obj1 = new Grupo();
_obj1.Nome = "Grupo 1";
_obj1.Descricao = "Descrição do Grupo1";
_obj1.DataCadastro = DateTime.Now;
session.Save(_obj1);

Grupo _obj2 = new Grupo();
_obj2.Nome = "Grupo 2";
_obj2.Descricao = "Descrição do Grupo 2";
_obj2.DataCadastro = DateTime.Now;
session.Save(_obj2);

transaction.Commit();
}
}
}
[/sourcecode]

Cadastrar Pessoa Fisica

Vamos cadastrar uma pessoa fisica, veja que estamos instânciando a classe PessoaFisica que herda de Pessoa

[sourcecode language=”csharp”]
[TestMethod]
public void Cadastrar_Pessoa_Fisica()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
PessoaFisica _obj = new PessoaFisica();
_obj.Nome = "Nome da pessoa fisica";
_obj.Endereco = "Endereço da pessoa fisica";
_obj.Cep = "12345678";
_obj.Email = "pessoa1@gmail.com";
_obj.DataCadastro = DateTime.Now;
_obj.Cpf = "12345678900";
_obj.Nacionalidade = "Brasil";

_obj.Departamento = session.Get<Departamento>(1);

_obj.Status = Status.Inativo;

session.SaveOrUpdate(_obj);
transaction.Commit();
}
}
}
[/sourcecode]

Linha 19: Aqui temos que recuperar um Departamento que foi cadastrado anteriormente, por isso usamos a o opação Get passando o código

Linha 21: Usamos o nosso Enum para dizer o status da pessoa

Cadastrar Pessoa Juridica

Para a pessoa juridica segue o mesmo padrão da pessoa fisica

[sourcecode language=”csharp”]
[TestMethod]
public void Cadastrar_Pessoa_Juridica()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
PessoaJuridica _obj = new PessoaJuridica();
_obj.Nome = "Nome da pessoa juridica";
_obj.Endereco = "Endereço da pessoa juridica";
_obj.Cep = "12345678";
_obj.Email = "pessoa1@gmail.com";
_obj.DataCadastro = DateTime.Now;
_obj.Cnpj = "12345678901234";
_obj.WebSite = "www.pessoajuridica.com.br";

_obj.Departamento = session.Get<Departamento>(2);

_obj.Status = Status.Inativo;

session.SaveOrUpdate(_obj);
transaction.Commit();
}
}
}
[/sourcecode]

Cadastrar Pessoa Fisica com Telefones

Agora vamos cadastrar os Telefones de uma pessoa, veja abaixo o código

[sourcecode language=”csharp”]
[TestMethod]
public void Cadastrar_Pessoa_Fisica_Com_Telefone()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
PessoaFisica _obj = new PessoaFisica();
_obj.Nome = "Nome da pessoa fisica com telefone";
_obj.Endereco = "Endereço da pessoa fisica com telefone";
_obj.Cep = "12345678";
_obj.Email = "pessoa1@gmail.com";
_obj.DataCadastro = DateTime.Now;
_obj.Cpf = "12345678900";
_obj.Nacionalidade = "Brasil";

_obj.Departamento = session.Get<Departamento>(1);

_obj.Status = Status.Inativo;

_obj.Telefones.Add(new Telefone()
{
CodigoDdd = 41,
Numero = 123456
});

_obj.Telefones.Add(new Telefone()
{
CodigoDdd = 41,
Numero = 654321
});

session.SaveOrUpdate(_obj);
transaction.Commit();
}
}
}
[/sourcecode]

Linha 23 / 29 : Criamos uma nova instância da classe Telefone e adicionamos na propriedade Telefones que é uma lista

Cadastrar Pessoa Fisica com Telefones e com Grupos

Agora vamos cadastrar os Grupos de uma pessoa, veja abaixo o código

[sourcecode language=”csharp”]
[TestMethod]
public void Cadastrar_Pessoa_Fisica_Com_Telefone_Com_Grupo()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
PessoaFisica _obj = new PessoaFisica();
_obj.Nome = "Nome da pessoa fisica com telefone com telefone";
_obj.Endereco = "Endereço da pessoa fisica com telefone com telefone";
_obj.Cep = "12345678";
_obj.Email = "pessoa1@gmail.com";
_obj.DataCadastro = DateTime.Now;
_obj.Cpf = "12345678900";
_obj.Nacionalidade = "Brasil";

_obj.Departamento = session.Get<Departamento>(1);

_obj.Status = Status.Inativo;

_obj.Telefones.Add(new Telefone()
{
CodigoDdd = 41,
Numero = 123456
});

_obj.Telefones.Add(new Telefone()
{
CodigoDdd = 41,
Numero = 654321
});

_obj.Grupos.Add(session.Get<Grupo>(1));
_obj.Grupos.Add(session.Get<Grupo>(2));

session.SaveOrUpdate(_obj);
transaction.Commit();
}
}
}
[/sourcecode]

Linha 35 / 35 : Recupero o grupo e adiciona na lista de Grupo

Deletar Pessoa Fisica

Quando vamos deletar um registro, temos que tomar cuidado com os Cascade para não deletar entidades que não deviam ser deletadas

Nesse caso, quando deletar uma pessoa fisica, também será deletado seus Telefones e os Grupos que ela pertence da tabela (GruposToPessoas)

[sourcecode language=”csharp”]
[TestMethod]
public void Deletar_Pessoa_Fisica()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var _obj = session.Get<PessoaFisica>(6);
session.Delete(_obj);
transaction.Commit();
}
}
}
[/sourcecode]

Veja que a tabela Grupos não foi deletado.

Pesquisando Pessoa Fisica

[sourcecode language=”csharp”]
[TestMethod]
public void Pesquisar_Pessoa_Fisica()
{
var sessionFactory = Conexao.CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
var _obj = session.Get<PessoaFisica>(5);
Assert.IsNotNull(_obj);
Assert.IsTrue(_obj.Telefones.Count > 0);
}
}
[/sourcecode]

Em nosso próximo post vamos ver como gerar os famosos arquivos HBM através do fluent

Download do projeto

Deixe seu comentário, opinião, critica

Aquele abraço!

Sobre Leandro Prado

Leandro Silveira Prado é Premier Field Engineer na Microsoft especializado em Application Lifecycle Management.