none
Unique composto - Data Annotation RRS feed

  • Pergunta

  • Bom dia a todos.

    Tendo uma classe Pessoa, como a seguir:

    public class Pessoa 
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
    
        [Required(ErrorMessage = "O nome é obrigatório")]
        [MaxLength(60)]
        [MinLength(10)]
        public string Nome { get; set; }
    
        [Required(ErrorMessage = "O Email é obrigatório")]
        [MaxLength(130)]
        [MinLength(6)]
        public string Email { get; set; }
    
        [Required(ErrorMessage = "O Endereço é obrigatório")]
        [MaxLength(130)]
        [MinLength(6)]
        public string Endereco { get; set; }
    
        [MaxLength(80)]
        public string HomePage { get; set; }
    }

    Como posso especificar com Data Annotation que uma pessoa não pode ter o mesmo Nome e Email de uma pessoa já cadastrada?



    quinta-feira, 12 de janeiro de 2017 11:49

Respostas

  • Muito obrigado pela resposta Fulvio.

    Na realidade, repetição individual é permitido, não seria permitido a repetição conjunta.
    Com Data Annotation, eu poderia tratar direto no dominio, não seria preciso subir a tratativa para a camada de application .. 

    • Marcado como Resposta Eduardo Hipolito sexta-feira, 13 de janeiro de 2017 13:03
    quinta-feira, 12 de janeiro de 2017 18:53

Todas as Respostas

  • Olá Eduardo,

    Você pode resolver isso com a Notation Index.Com elas você consegue compor essas regras.

    Segue um Exemplo:

    [Index("IX_DUPLAVALIDACAO", 1, IsUnique = true)]
    [MaxLength(60)]
    [MinLength(10)]
    public string Nome { get; set; }

    [Index("IX_DUPLAVALIDACAO", 2, IsUnique = true)]
    [MaxLength(130)]
    [MinLength(6)]
    public string Email { get; set; }

    Certo?
    []'s

    ----
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!


    quinta-feira, 12 de janeiro de 2017 12:03
  • Muito obrigado pela ajuda Rodrigo

    Eu tentei isso, o problema é que assim eu não posso adicionar duas pessoas com o mesmo nome e com emails diferentes, ou com o mesmo email e nomes diferentes.

    O que preciso, é combinar as duas colunas no Index. Algo do tipo ... A classe pessoa é só para exemplo .. 

    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Primeiro objeto, sucesso
    
    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Nome e email repetidos, erro.
    
    new pessoa({"Eduardo", "eduardo@hotmail.com.br"}); //Nome repetido email não repedito, sucesso.
    
    new pessoa({"Rodrigo", "eduardo@hotmail.com"}); //Nome não  repetido email repedito, sucesso.




    quinta-feira, 12 de janeiro de 2017 16:05
  • Muito obrigado pela ajuda Rodrigo

    Eu tentei isso, o problema é que assim eu não posso adicionar duas pessoas com o mesmo nome e com emails diferentes, ou com o mesmo email e nomes diferentes.

    O que preciso, é combinar as duas colunas no Index. Algo do tipo ... A classe pessoa é só para exemplo .. 

    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Primeiro objeto, sucesso
    
    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Nome e email repetidos, erro.
    
    new pessoa({"Eduardo", "eduardo@hotmail.com.br"}); //Nome repetido email não repedito, sucesso.
    
    new pessoa({"Rodrigo", "eduardo@hotmail.com"}); //Nome não  repetido email repedito, sucesso.


    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Nome e email repetidos, erro.
    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Nome e email repetidos, erro.
    new pessoa({"Eduardo", "eduardo@hotmail.com"}); //Nome e email repetidos, erro.

    Se pode fazer para cada campo um unique, porque, pelo visto você não quer repetição de maneira nenhuma invidualmente e na junção, então crie unique na sua tabela. O que pode ser barato também é consultar antes de inserir ou seja, faça uma pesquisa com SQL para ver se já existe.

    Fulvio C

    quinta-feira, 12 de janeiro de 2017 17:40
  • Muito obrigado pela resposta Fulvio.

    Na realidade, repetição individual é permitido, não seria permitido a repetição conjunta.
    Com Data Annotation, eu poderia tratar direto no dominio, não seria preciso subir a tratativa para a camada de application .. 

    • Marcado como Resposta Eduardo Hipolito sexta-feira, 13 de janeiro de 2017 13:03
    quinta-feira, 12 de janeiro de 2017 18:53
  • Preciso que fique assim no banco: 
    CREATE UNIQUE NONCLUSTERED INDEX [IX_DUPLAVALIDACAO]
        ON [dbo].[Pessoa]([Nome], [Email]);
    Apenas não sei como fazer com data annotation 
    quinta-feira, 12 de janeiro de 2017 19:44