Discutimos os atributos mais utilizados em uma aplicação e como criar um Validation customizado em outros posts, neste vamos ver como trabalhar com EF ou L2Q, para montar esse exemplo vou utilizar o EF.
A versão atual do EF não oferece suporte a POCO todo código de mapeamento do modelo físico para o conceitual é feito via desing sem a necessidade de escreve uma linha de código, isso na minha opinião é muito bom, mais esse beneficio é um problema para os DataAnnotations , isso porque toda vez que você atualiza o seu modelo via desing todo o código é recriado, e se você decorar as propriedades direto no código gerado pela ferramenta você perderá tudo na próxima atualização.Veja o aviso nas primeiras linhas do código gerado.
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
// Runtime Version:2.0.50727.4927
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
//------------------------------------------------------------------------------
Resumindo você não deve colocar nenhum código ai a não ser que você queira retrabalho, então como resolve esse problema?
Para resolve esse problema existe uma técnica chamada "buddy classes" , você basicamente precisa criar uma classe separada que contenha todas as propriedades que você quer validar e decorar as propriedades com os atributos necessários, o segundo passo é "ligar" essa classe com a classe gerada pelo EF, para isso você deve criar uma partial class da classe gerada pelo EF e decorar essa classe com o atributo MetadataType apontando para sua "buddy classes". Vamos ver como isso tudo funciona com um exemplo.
Vou começar o exemplo definindo um model, defini um banco de dados simples para armazenar informações de evento e a partir desse banco gerei EDMX. Veja as definições nas imagens abaixo.
Imagem 1 - Banco de dados.
|
Imagem 2 - Entity Framework.
|
Vamos agora adicionar as validações na entidade Evento para isso adicione uma classe que será nossa “buddy classes” , veja a definição da classe abaixo.
[MetadataType(typeof(EventoValidation))]
public partial class Evento
{
}
public class EventoValidation
{
[Required(ErrorMessage = "O campo Nome é obrigatório.")]
public string Nome { get; set; }
[Required(ErrorMessage = "O campo Site é obrigatório.")]
[RegularExpression(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", ErrorMessage = "URL inválida.")]
public string Site { get; set; }
[Required(ErrorMessage = "O campo Local é obrigatório.")]
public string Local { get; set; }
[Required(ErrorMessage = "O campo Data é obrigatório.")]
public DateTime Data { get; set; }
[Required(ErrorMessage = "O campo Valor é obrigatório.")]
[Range(0, 9999, ErrorMessage = "Valor do evento inválido.")]
public decimal Valor { get; set; }
}
Na classe EventoValidation adicione todas as validações necessárias, como você já deve ter percebido as propriedades precisam ter o mesmo nome e tipo das propriedades gerada pelo EF, e por fim a partial class Evento foi decorada com o atributo MetadataType que “liga” a classe EventoValidation a classe gerada pelo EF.
Para finalizar o exemplo e verificar se tudo esta funcionando perfeitamente precisamos de um Controller e duas Views, veja abaixo a definição do controller Evento.
public class EventoController : Controller
{
EventoRepositorio eventoRepositorio = new EventoRepositorio();
//
// GET: /Evento/
public ActionResult Index()
{
return View(eventoRepositorio.ObterTodos());
}
public ActionResult Create()
{
return View(new Evento());
}
[HttpPost]
public ActionResult Create(Evento evento)
{
if (ModelState.IsValid)
{
eventoRepositorio.Inserir(evento);
return RedirectToAction("Index");
}
return View();
}
}
O código acima não tem nenhuma novidade falta apenas definir o repositório, veja abaixo.
public class EventoRepositorio
{
DatabaseEntities context = new DatabaseEntities();
public void Inserir(Evento evento)
{
context.AddToEvento(evento);
context.SaveChanges();
}
public IEnumerable<evento> ObterTodos()
{
return context.Evento.AsEnumerable();
}
}
Para criar as Views clique com direto nas actions Index e Create, selecione Add View e configure-as conforme as imagens abaixo.
Imagem 3 - Configurações da view Index.
|
Imagem 4 - Configurações da view Create.
|
Agora você pode executar a aplicação, para finalizar falta apenas as validações no client para habilitá-las adicione as três linhas abaixo na view Create.
Um pouco trabalhoso o que você achou?
Esse exemplo também é valido para quem utiliza L2Q, baixe o exemplo em C# ou VB.NET.
Daniel Fonseca Castro