Como funciona o Lazy Load

Para finalizar essa nossa série sobre Fluent NHibernate, hoje vamos configurar o Lazy Load

  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

O que Lazy Load?

O conceito de Lazy Load vem dos frameworks de ORM como NHibernate e Entitty Framework. Esse conceito permite que quando temos mapeamentos com associaçãoes entre as entidades sejam carregadas apenas quando realmente forem utilizadas, dessa forma quando efetuamos uma cosulta somente o objeto PAI é carrado em memória, e quando necessitar do objeto FILHO acessamos a propriedade e automaticamente será requisitado para o ORM carregar esse objeto FILHO em memória.

No Fluent NHibernate o Lazy Load vem configurado como default TRUE, isso quer dizer que sempre será carregado apenas os objetos PAI e quando requisitado será carregado os objetos FILHOS

Para ver o Lazy funcionando vamos alterar a nossa classe Pessoa desabilitando o Lazy Load, conforme abaixo

[sourcecode language=”csharp”]
HasMany(x => x.Telefones)
.Cascade.All()
.Not.LazyLoad();
[/sourcecode]

E quando executamos uma consulta (Pesquisar_Pessoa_Fisica) podemos ver que será executada duas querys no banco de uma só vez

[sourcecode language=”sql”]
NHibernate.SQL: 2012-03-17 15:38:47,420 DEBUG SQL:0 –
SELECT
pessoafisi0_.Pessoa_id as Codigo3_0_,
pessoafisi0_1_.Nome as Nome3_0_,
pessoafisi0_1_.Endereco as Endereco3_0_,
pessoafisi0_1_.Cep as Cep3_0_,
pessoafisi0_1_.Email as Email3_0_,
pessoafisi0_1_.DataCadastro as DataCada6_3_0_,
pessoafisi0_1_.Status as Status3_0_,
pessoafisi0_1_.Departamento_id as Departam8_3_0_,
pessoafisi0_.Cpf as Cpf4_0_,
pessoafisi0_.Nacionalidade as Nacional3_4_0_
FROM
[PessoaFisica] pessoafisi0_
inner join [Pessoa]
pessoafisi0_1_ on pessoafisi0_.Pessoa_id=pessoafisi0_1_.Codigo
WHERE
pessoafisi0_.Pessoa_id=@p0;
@p0 = 4 [Type: Int32 (0)]

NHibernate.SQL: 2012-03-17 15:38:47,610 DEBUG SQL:0 –
SELECT
telefones0_.Pessoa_id as Pessoa4_1_,
telefones0_.Codigo as Codigo1_,
telefones0_.Codigo as Codigo6_0_,
telefones0_.CodigoDdd as CodigoDdd6_0_,
telefones0_.Numero as Numero6_0_,
telefones0_.Pessoa_id as Pessoa4_6_0_
FROM
[Telefone] telefones0_
WHERE
telefones0_.Pessoa_id=@p0;
@p0 = 4 [Type: Int32 (0)]
[/sourcecode]

Agora se deixarmos o lazy load trabalhar, a segunda query só irá ser execuada quando chamar a propriedade _obj.Telefones

E dessa forma chegamos aom FIM dessa série sobre Fluent NHibernate, o código fonte dessa aplicação está em http://fluentnhibernate.codeplex.com

Qualquer dúvida, opinião, reclamação mande seu comentário!

Aquele Abraço!

Sobre Leandro Prado

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