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É 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/