8

Se model-first, si utilizza [MetadataType(typeof(ConceptMetadataSource))] per allegare un file MetadataSource che contiene tutte le annotazioni di dati come [HiddenInput(DisplayValue = false)] o [Display(Name = "Title")].Come aggiungere annotazioni dati per entità create automaticamente da Data-First?

Ad esempio:

[MetadataType(typeof(ConceptMetadataSource))] 
public partial class Concept 
... 

Ora, sto utilizzando l'approccio database prima in quanto v'è un database esistente. Questa volta, le classi di entità vengono create automaticamente dal modello edmx. All'inizio di ogni classe di entità, non v'è righe di commento qui sotto:

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

Dal momento che il codice verrà rigenerato una volta modifichiamo una tabella nel database, le annotazioni di dati sarà spazzato via ogni volta che le classi di entità sono rigenerato.

Qualcuno può dirmi qual è il metodo migliore per annotare tali classi di entità? Grazie.

+0

avete ancora trovato una soluzione, Blaise? – reidLinden

+0

Sì @reidLinden, usa la classe parziale. – Blaise

+0

Come posso chiudere questa domanda? Questa risposta non è buona e ho già una soluzione. – Blaise

risposta

6

Bene, ecco la risposta.

Il trucco è che le classi generate automaticamente sono tutte classi parziali. Il processo di compilazione combina tutte le classi parziali con lo stesso nome.

Se abbiamogenerato da DbContext, tutto ciò che dobbiamo fare è crearne un altro iniziato con public partial class Concept. Questa nuova classe parziale può essere creata in una cartella diversa, ma è necessario che il suo spazio dei nomi sia aggiornato alla stessa della classe parziale generata automaticamente.

In questa classe parziale appena creata, possiamo aggiungere tutti i tipi di schede annotazioni come

[Required(ErrorMesssage="This Field is required")] 

Oppure, possiamo anche aggiungere nuove proprietà, come

FullName {get {return string.Format("{0} {1}", FirstName, LastName);}} 

Se il modello viene aggiornato dal database nuovamente, verranno aggiornate solo le classi parziali generate automaticamente. Le nuove classi parziali aggiunte manualmente che contengono le nostre annotazioni e altre manipolazioni rimarranno intatte.

+0

eccellente, grazie! – reidLinden

0

definire un modello di vista come

public class VMConcept 
{ 
    public Concept NewConcept {get; set;} 
} 

[MetadataType(typeof(ConceptMetadataSource))] 
public partial class Concept{} 

public class ConceptMetadataSource { 

[Required(ErrorMesssage="This Field is required")] 
public string PropertyName {get; set;} 
} 
+0

Grazie per la risposta, John. Ma la difficoltà è che una volta modificata la tabella di Concept, i Concept.cs verranno ricreati. E tutti gli attributi di annotazione saranno rimossi. Hai davvero scritto quelli [Richiesto ...] tag all'interno delle classi generate da edmx? – Blaise

+0

no nelle classi con 'edmx', ho aggiornato la risposta, definisco un modello di vista che avrà la proprietà di tipo' Concept' ... –

+0

La seconda sezione aggiunge ancora l'attributo [MetadataType] nella classe Concept. Dovrebbe essere 'public class partial VMConcept {}'? – Blaise

12

Tutto ciò che dovete fare è creare un'altra classe parziale e utilizzare l'attributo metadatatype. Ecco il codice di esempio

//This is generated by EDMX 

namespace DataLayer 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Customer 
    { 
     public Customer() 
     { 
      this.CustomerAddresses = new HashSet<CustomerAddress>(); 
      this.CustomerOrders = new HashSet<CustomerOrder>(); 
     } 

     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string EmailId { get; set; } 


     public Nullable<System.DateTime> DateOfBirth { get; set; } 

     public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; } 
     public virtual ICollection<CustomerOrder> CustomerOrders { get; set; } 
    } 
} 

Add seguente codice manualmente

namespace DataLayer 
{ 
    [MetadataType(typeof(CustomerMetaData))] 
    public partial class Customer 
    { 

    } 
    public class CustomerMetaData 
    { 
     [StringLength(10, ErrorMessage = "First name must be 25 characters or less in length.")] 
     [Required(ErrorMessage = "First name is required.")] 
     public String FirstName { get; set; } 
    } 
} 
Problemi correlati