Pergunta

Eu decidi usar o Entity Framework para O / R Mapping, e DataAnnotations para validação no meu projeto, e eu já encontrou um problema estranho ao tentar implementar isso.

Este é o que eu fiz:

Eu tenho o seguinte tipo de entidade

Contact
*******
Int32 Id (not null, Entity Key)
Name Name (not null) 
Address Address (not null)
String Phone
String Email

onde Name e Address são tipos complexos definidos da seguinte forma:

Name                                  Address
****                                  *******
String First (not null)               String Street (not null)
String Last (not null)                String ZipCode (not null)
                                      String City (not null)

E as seguintes classes residir no mesmo espaço de nomes como os meus entidades:

public class ContactMetadata
{
    [Required]
    public Name Name { get; set; }
}

[MetadataType(typeof(ContactMetadata))]
partial class Contact { }

No entanto, quando eu criar um novo item Contact, os tipos Name e Address estão cheios de casos de Name e Address onde todos os valores são null, em vez de Name e Address ter próprios valores null. Assim, o atributo Required não lançar quaisquer erros, apesar de todos os valores são null. Como posso resolver isso?

Foi útil?

Solução

Assim, ele cria instâncias do nome e endereço objetos que suas propriedades são nulos? Interessante.

Você pode simplesmente colocar o atributo [Obrigatório] sobre as crianças?

EDIT: Eu sei que isso pode ser considerado uma forma fedorento de fazer isso, mas para maior clareza eu editar a sua resposta para o post, para que ele possa mais fácil ser encontrado pela próxima pessoa a ter problemas com isso ...

Sugestão (e aceito, mas ainda não testado) Solução:

Escrever um atributo de validação personalizada que valida contra os valores null.

Outras dicas

Certifique-se os nomes que acabam em campos HTML alinhar com os nomes das propriedades da classe.

Por exemplo, se você tem o seguinte:

public class Contact {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

public class Address {
    public string Street { get; set; }
    public string City { get; set; }
    [...]
}

As suas chamadas para os ajudantes HTML deve olhar como este:

<%= Html.TextBox("FirstName") %>
<%= Html.TextBox("LastName") %>
<%= Html.TextBox("Address.Street") %>
<%= Html.TextBox("Address.City") %>
[...]

Confira este post complexo DataAnnotations-validação . Eu acho que o atributo RequiredAssociation é o que você precisa. Você pode ter que ajustá-lo um pouco para Entity Framework em vez de LINQ to SQL.

Eu estou lutando com o mesmo problema agora. Eu acho que uma forma semi-graciosa de fazer isso é para fazer referência ao tipo primitivo chave como uma propriedade, e colocar o DataAnnotation sobre isso. Aqui está um exemplo com AddressID sendo o campo de chave.

public class Contact{

[Required]
public int? AddressIDForValidation{
get{return this.Address.AdressID;}
}

public Address Address{get;set;}
}



public class Address{
public int? AddressID{get;set;}
public string Street{get;set;}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top