Domanda

Ho deciso di utilizzare Entity Framework per O / R Mapping, e DataAnnotations per la convalida nel mio progetto, e ora ho incontrato un problema strano quando si cerca di implementare questo.

Questo è quello che ho fatto:

Ho il seguente tipo di entità

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

dove Name e Address sono tipi complessi definiti come segue:

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

E le seguenti classi risiedono nello stesso spazio dei nomi come il mio entità:

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

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

Tuttavia, quando creo un nuovo Contact elemento, il null e Required tipi sono pieni di esempi di <=> e <=> dove tutti i valori sono <=>, invece di <=> e <=> avente <=> valori stessi. Così, il <=> attributo non genera un errore anche se tutti i valori sono <=>. Come posso ovviare a questo?

È stato utile?

Soluzione

Quindi crea istanze di nome e indirizzo degli oggetti che le sue proprietà sono nulli? Interessante.

Si può solo mettere l'attributo [Required] sui figli?

EDIT: So che questo potrebbe essere considerato un modo puzzolente di fare questo, ma per chiarezza posso modificare la tua risposta nel post, in modo che possa più facilmente essere trovata la prossima persona ad avere problemi con questo ...

consigliato (e accettato, ma ancora sottoposti a verifica) soluzione:

Scrivi un attributo di convalida personalizzato che convalida contro i null valori.

Altri suggerimenti

Assicurarsi che i nomi che finiscono nei campi HTML si allineano con i nomi delle proprietà della classe.

Ad esempio, se si dispone di questo:

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; }
    [...]
}

Le chiamate agli helper HTML dovrebbe essere simile a questo:

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

Dai un'occhiata a questo post sul blog complessi-dataannotations-validazione . Credo che l'attributo RequiredAssociation è quello che serve. Potrebbe essere necessario modificarlo un po 'per Entity Framework, invece di LINQ to SQL.

Sono alle prese con lo stesso problema in questo momento. Penso che un modo semi-elegante per farlo è quello di fare riferimento al tipo primitivo chiave come una proprietà, e mettere il dataannotation su questo. Ecco un esempio con AddressID essendo il campo chiave.

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;}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top