2010-06-08 20 views
10

Ho utilizzato Entity Framework con VS2010 per creare una classe di una persona semplice con proprietà, firstName, lastName ed email. Se voglio allegare DataAnnotations come in questo blog post ho un piccolo problema perché la mia classe persona viene generata dinamicamente. Potrei modificare direttamente il codice generato dinamicamente ma ogni volta che devo aggiornare il mio modello tutto il mio codice di convalida verrebbe cancellato.Utilizzo di DataAnnotations con Entity Framework

Il primo istinto era quello di creare una classe parziale e provare ad allegare annotazioni ma si lamenta che sto provando a ridefinire la proprietà. Non sono sicuro che tu possa fare dichiarazioni di proprietà in dichiarazioni di funzione come C# in C++. Se potessi quella potrebbe essere la risposta. Ecco un frammento di quello che ho provato:

namespace PersonWeb.Models 
{ 
    public partial class Person 
    { 
    [RegularExpression(@"(\w|\.)[email protected](\w|\.)+", ErrorMessage = "Email is invalid")] 
    public string Email { get; set; } 
    /* ERROR: The type 'Person' already contains a definition for 'Email' */ 
    } 
} 
+0

Sono davvero deluso dal fatto che non è possibile definire una classe parziale e decorarla con Annotazioni dei dati come mostrato nel proprio esempio di codice. Quello fu il mio primo istinto; poi mi sono imbattuto in questo post e non vedo nessuna soluzione che mi sembra attraente. Il team di ef dovrebbe fornire un meccanismo di mappatura per aggirare questa idiosincrasia piuttosto noiosa. – nocarrier

risposta

24

Una classe Buddy è più o meno la direzione lo snippet di codice è in cammino, tranne che per il classe Persona parziale codificati manualmente avrebbe avuto una classe interna, come:

[MetadataType(typeof(Person.Metadata))] 
public partial class Person { 
    private sealed class MetaData { 
     [RegularExpression(...)] 
     public string Email { get; set; } 
    } 
} 

Oppure si potrebbe avere la vostra classe Persona manualmente parziale e una classe Meta separata come:

[MetadataType(typeof(PersonMetaData))] 
public partial class Person { } 

public class PersonMetaData { 
[RegularExpression(...)] 
public string Email; 
} 

Questi sono soluzioni alternative e avente una classe di presentazione mappata può essere più adatto.

+0

Vuoi essere così gentile da elaborare sulla 'classe di presentazione mappata' che hai citato? –

+0

Sicuro. Probabilmente avrei dovuto dire View Model piuttosto che classe di presentazione. Il link nel commento di Craig Stuntz qui sotto ha un esempio. Inoltre: http://stackoverflow.com/questions/2859618/should-i-map-a-domain-object-to-a-view-model-using-an-optional-constructor http://stackoverflow.com/domande/8298401/schemi-per-mapping-dati-tra-domain-modelli –

3

È necessario usare sia ad un metadati "compagno" di classe o (la mia preferenza) project onto a presentation model instead of binding views directly to entities.

+0

Puoi dare qualche dettaglio in più sul tuo approccio alle classi "buddy" dei metadati. Preferirei se il codice di presentazione e la convalida avessero una separazione di preoccupazioni. – dcompiled

+0

"Il mio approccio" alle classi "amico" è di non usarli. Come ho detto, uso i modelli di presentazione. Se vuoi la * vera * separazione delle preoccupazioni, questa è la strada da percorrere. –

+0

È solo una questione di stile, penso che tutto il codice di convalida e i relativi metadati debbano rimanere nel modello. Sembra che tu preferisca avere un codice di convalida mescolato con il modello di presentazione. – dcompiled