Desenvolvimento - ASP. NET

Usando Nullable Types com NHibernate para campos DateTime

Este artigo aborda como resolver o problema de usar propriedades/campos DateTime com o NHibernate.

por Marcos Dell Antonio



Este artigo aborda como resolver o problema de usar propriedades/campos DateTime com o NHibernate.

É muito comum encontrar propriedades persistentes do tipo DateTime. Por padrão, assim que o objeto é instanciado, já é atribuído a ela o valor DateTime.MinValue (1/1/0001), e isso gera vários problemas, dentre eles:

- Não é possível salvar campos do tipo DateTime com o valor null, sendo que o banco suporta;
- Alguns bancos tem um limite inferior para os campos do tipo DateTime, e esse limite não chega até 1/1/0001;
- Ao montar uma Query By Example (QBE) usando o NHibernate, o campo do tipo DateTime será incluído na query SQL.

Vale lembrar que o tipo DateTime é um Value Type, e, portanto, não pode receber o valor null.

Então eis a questão: se propriedades DateTime não podem receber o valor null e isso gera um grande problema para os bancos de dados, o que fazer? A resposta é usar uma nova funcionalidade do Framework .NET 2.0, que se chama Nullable Types.

- O Problema (propriedades persistentes do tipo DateTime)

Veja na imagem abaixo o mapeamento OR do campo DataCadastro da tabela Clientes:

XML:

Propriedade DataCadastro da classe Clientes:

Ao tentar gravar um objeto do tipo Clientes sem carregar a propriedade DataCadastro, ela automaticamente assumirá o valor DateTime.MinValue (1/1/0001). Veja:

Além disso, como a propriedade DataCadastro vai estar sempre com um valor diferente de null, ela será incluída na QBE. Veja:

Tendo como exemplo o seguinte objeto:

A QBE será gerada assim:

Não informei a DataCadastro e mesmo assim ela apareceu no WHERE.

- A Solução (Nullable Types)

Para resolver o problema apresentado acima, basta definir no mapeamento OR (somente na classe) que a propriedade DataCadastro será do tipo DateTime?, da seguinte forma:

Como disse acima, não é preciso alterar o arquivo XML, somente a classe Clientes. Lógico que a declaração do campo _datacadasro (que é private) também deve ser alterada. No construtor da classe Clientes também pode ser atribuído o valor null para a propriedade DataCadastro.

Dessa forma, ao inserir um registro sem carregar a propriedade DataCadastro, o resultado é o campo DataCadastro vazio. Veja:

E ao executar uma QBE usando o mesmo exemplo de antes, esse campo também não aparecerá mais na cláusula WHERE. Veja:

- Conclusão

Depois de alguns dias quebrando a cabeça, aí está a "receita de bolo". Nullable Types realmente tornou muito simples esta tarefa.

Se alguém estiver a fim de discutir sobre NHibernate, pode entrar em contato comigo.

- Referências

Fórum do NHibernate:
http://forum.hibernate.org/viewforum.php?f=25

Nullables Types:
http://msdn.microsoft.com/vcsharp/2005/overview/language/nullabletypes/

Marcos Dell Antonio

Marcos Dell Antonio - Profissional certificado (MCPD, MCTS e MCP) em tecnologias da Microsoft e especialista em .NET e Visual Studio Team System. Site: www.marcosdellantonio.net.