none
DataAnnotations com EF e MVC 4 RRS feed

  • Pergunta

  • Pessoal tenho um aplicação que foi desenvolvida com EF Database first e asp.net mvc 4, o problema é que ela ja encontra-se em produção e preciso implementar o dataannotations nas classes para a validação ser mais rápida, mas como faço isso já que o ef cria as classes automaticamente.

    Desde já agradeço.

    quinta-feira, 11 de abril de 2013 00:29

Respostas

  • Thiago, não tem muito mistério meu velho.

    Vamos por passos:

    1. Gere seu EDMX

    2. Crie uma pasta chamada "Validation"

    3. Crie uma classe parcial (partialclass) chamada "Cidades" (como exemplo) dentro da pasta "Validation".

    4. Deixe o namespace dessa partialclass idêntico ao namespace do EDMX gerado

    5. Siga o código abaixo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel;
    
    namespace [SeuNamespace]
    {
        [MetadataType(typeof(Cidades_Metadata))]
        public partial class Cidades
        {
        }
    
        public class Cidades_Metadata
        {
            [Required(ErrorMessage = "Nome obrigatório")]
            [DisplayName("Nome:")]
            [StringLength(100)]
            public string [Propriedade1]{ get; set; }
    
            [Required(ErrorMessage = "Email inválido!")]
            [DisplayName("Email:")]
            [Email(ErrorMessage = "Email inválido!")]
            public string [Propriedade2]{ get; set; }
        }
    }

    O código entre colchetes é para você substituir pelos seus parâmetros aí Ok?

    • Marcado como Resposta Thiago_Porto sexta-feira, 12 de abril de 2013 11:54
    quinta-feira, 11 de abril de 2013 20:20
    Moderador

Todas as Respostas

  • Já tinha visto esse artigo, mas não consegui entender muito bem de como passar os valores para qual classe.
    quinta-feira, 11 de abril de 2013 01:25
  • É bem simples. É só vc criar uma partial class da classe que vc quer validar. Ai vc coloca o MetadataType em cima dela. Desse modo:

        [MetadataType(typeof(Sua_Classe))]
        public partial class Sua_Classe
        { }
    
    
        public class Valida_SuaClasse
        {
            [Required]
            public int ID { get; set; }
    
            [Required]
            [StringLength(50)]
            public string Nome { get; set; }
            
        }

    Esses arquivos com partial classes e seu arquivo .EDMx devem estar na mesma pasta.

    quinta-feira, 11 de abril de 2013 02:06
  •  [MetadataType(typeof(Sua_Classe))]
        public partial class Sua_Classe          ============== "Tem que ser o mesmo nome da entidade que o EF mapeou?"
        { }
    
    
        public class Valida_SuaClasse           ============== "Essa classe que usarei em minha view? "
        {
            [Required]
            public int ID { get; set; }
    
            [Required]
            [StringLength(50)]
            public string Nome { get; set; }
            
        }
    quinta-feira, 11 de abril de 2013 02:13
  •  [MetadataType(typeof(Sua_Classe))]
        public partial class Sua_Classe          ============== "Tem que ser o mesmo nome da entidade que o EF mapeou?"
        { }
    
    
        public class Valida_SuaClasse           ============== "Essa classe que usarei em minha view? "
        {
            [Required]
            public int ID { get; set; }
    
            [Required]
            [StringLength(50)]
            public string Nome { get; set; }
            
        }

    Resposta 1: sim

    Resposta 2: não - você vai usar a "Sua_Classe", a entidade do banco de dados.

    E o correto no código acima é: 

    [MetadataType(typeof(Valida_SuaClasse))]
    quinta-feira, 11 de abril de 2013 04:54
    Moderador
  • Dentro da minha model criei uma classe chamada cidades igual está mapeado e o vs pediu para substituir cliquei em sim, fiz como as repostas mas a classe não consigo visualizar mais a classe e na view não aparece os campos.
    quinta-feira, 11 de abril de 2013 12:11
  • Crie os arquivos de validação em uma pasta diferente mas com o mesmo namespace das suas entidades. 

    Pra corrigir o seu problema gere novamente o edmx e faça como sugeri acima.


    quinta-feira, 11 de abril de 2013 20:00
    Moderador
  • Cara teria como fazer uma aplicação de exemplo e postar ou mandar no meu email: thiago__porto@hotmail.com

    Pq testei aqui e não funcionou, ta difícil esse negócio :(

    quinta-feira, 11 de abril de 2013 20:04
  • Thiago, não tem muito mistério meu velho.

    Vamos por passos:

    1. Gere seu EDMX

    2. Crie uma pasta chamada "Validation"

    3. Crie uma classe parcial (partialclass) chamada "Cidades" (como exemplo) dentro da pasta "Validation".

    4. Deixe o namespace dessa partialclass idêntico ao namespace do EDMX gerado

    5. Siga o código abaixo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel;
    
    namespace [SeuNamespace]
    {
        [MetadataType(typeof(Cidades_Metadata))]
        public partial class Cidades
        {
        }
    
        public class Cidades_Metadata
        {
            [Required(ErrorMessage = "Nome obrigatório")]
            [DisplayName("Nome:")]
            [StringLength(100)]
            public string [Propriedade1]{ get; set; }
    
            [Required(ErrorMessage = "Email inválido!")]
            [DisplayName("Email:")]
            [Email(ErrorMessage = "Email inválido!")]
            public string [Propriedade2]{ get; set; }
        }
    }

    O código entre colchetes é para você substituir pelos seus parâmetros aí Ok?

    • Marcado como Resposta Thiago_Porto sexta-feira, 12 de abril de 2013 11:54
    quinta-feira, 11 de abril de 2013 20:20
    Moderador
  • Boa explicação!

    Antonio Cardoso S. Júnior - MCP, Partner Network Blog - http://devnetbr.wordpress.com/

    sexta-feira, 27 de setembro de 2013 19:27
  • Uma dúvida:

    Quando eu criar minha View para Insert no banco eu tenho que colocar esta class "Cidade_MetaData"

    Ex: 

    @model MVC4Estudies.Model.Cidade_MetaData

    No meu caso eu uso repositorio genérico e UnitOfWork e dai ela não reconheçe esta entidade.

    Como proceder?


    Antonio Cardoso S. Júnior - MCP, Partner Network Blog - http://devnetbr.wordpress.com/

    sexta-feira, 27 de setembro de 2013 20:01
  • Olá Antonio,

    A classe de Metadata serve somente para a validação. Use a classe padrão nas suas views e controllers:

    @model MVC4Estudies.Model.Cidade


    sábado, 28 de setembro de 2013 19:40
    Moderador