Entity Framework 4.1 – Validations

O Entity Framework 4.1 fornece uma grande variedade de ferramentas para validação de dados. Neste exemplo vamos apresentar algumas das técnicas que podemos encontrar dentro do EF 4.1.

Data Annotations

Data Annotations são atributos, contidos no namespace System.ComponentModel.DataAnnotations, que quando adicionados em nossas classes fornecem características a nossos atributos e as suas respectivas colunas no banco de dados. Alguns desses atributos possuem caráter de validação, como: Required, exige que o campo seja preenchido; MaxLength, limita o tamanho do campo a uma quantidade máxima de caracteres; e MinLength, indica a quantidade mínima de caracteres.

efValidationPeople

Ao tentar salvar os dados na base de dados se algumas das restrições não estiverem sendo atendidas exceptions serão lançadas.

Fluent API Validations

O uso de Fluent API substitui o uso de Data Annotations e resulta no mesmo funcionamento. Ao contrário dos Data Annotations, as restrições não são inclusas na entidade, elas são inclusas no método OnModelCreating da classe de contexto com o banco de dados.

efValidationDataBaseContextFull

IValidatableObject

Para validações mais complexas que exijam alguma lógica ou verificação dentro de um contexto, a interface IValidatableObject, contida no namespace System.ComponentModel.DataAnnotations, fornece o método Validate que é invocado durante o comando SaveChanges, ou que pode ser chamado a qualquer momento que quisermos validar o conteúdo de nossa classe.

O método Validate retorna uma coleção de ValidationResults. Cada ValidationResult deve representar a validação efetuada, indicando a mensagem de erro e as propriedades que estão associadas com a validação.

efValidationPeopleFull

Executando validações prévias

Para execução de validações prévias, antes de executar o comando SaveChanges, é possível executar o método GetValidationErrors, presente no contexto com o banco de dados. Esse método retorna uma coleção de erros encontrados durante a validação das entidades adicionadas no contexto. O exemplo abaixo ilustra sua utilização.

efGetValidationErrors

Captura de exceções geradas por validações

Sempre que uma validação encontrar um erro dentro do domínio de entrada, uma exception do tipo DbEntityValidationException será disparada. Para receptar essas exceções e fazer o tratamento necessário, faça desta maneira:

efCapturaDeErros

Como pudemos ver, validações complexas devem ser tratadas pelo uso da interface IValidatableObject, enquanto que restrições de entrada (i.e. valores nulos, valores em branco, valores fora do tamanho esperado) deve utilizar Fluent API Validations ou Data Annotations. Entre o uso de Fluent API Validations ou Data Annotations, fico pelo uso de Data Annotations, pois utiliza uma sintaxe mais simples, mais fácil de ser escrita, mais fácil de ser entendida e segue um padrão sintático mais próximo ao das demais DataAnnotations.

Para fazer download do exemplo, acesse: http://code.msdn.microsoft.com/Entity-Framework-41-a701026d

Por
Fernando Henrique Inocêncio Borba Ferreira.

Publicidade

2 comentários sobre “Entity Framework 4.1 – Validations

  1. Olá Fernando,

    Obrigado pelo post.

    Estou procurando por uma solução para criar a validação na camada de serviços da aplicação (BLL) e acabei caindo no seu blog mais uma vez. =)

    Existe alguma forma de criar essa validação a nivel de regra de negócio, retornando uma coleção também com o ValidationResult ?

    Como estou trabalhando com WinForms, a ideia é receber essa coleção de erros, procurar o componente ligado a essa propriedade no form e identificar o erro nele, mais ou menos como o MVC já faz automaticamente.

  2. Olá Alexandre,
    Infelizmente isso não é possível, pois o método SaveChanges() precisa ser executado para que as validações ocorram.

    O que pode ser feito é: criar uma classe que contenha as validações necessárias, cuja sua camada de negócio invoque-a, além do método validate. Isto é, encapsule suas validações em uma classe e faça a sua BLL e o método Validate a invocarem. O problema é que vc vai acabar por validar os mesmos dados duas vezes…

    Obrigado por postar.
    []s!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.