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.
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.
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.
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.
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:
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.
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.
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!