2013-03-25 3 views
21

Qual è il modo migliore di utilizzare le annotazioni di dati per la convalida se sto utilizzando un primo approccio al database di Entity Framework (v5.0)?Annotazioni di dati con Entity Framework 5.0 (primo database)

Questa è la mia classe parziale creato da Entity Framework:

//------------------------------------------------------------------------------ 
// <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> 
//------------------------------------------------------------------------------ 

using System.ComponentModel.DataAnnotations; 

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

    public partial class PayrollMarkup_State 
    { 
     [UIHint("StatesEditor")] // <-- I added this line but it will be overwritten 
     public string State { get; set; } 
     public Nullable<float> MaintenancePercentage { get; set; } 
     public Nullable<float> OfficePercentage { get; set; } 
    } 
} 

ho provato questo senza successo ....

Entity Framework file generato: '' PayrollMarkup_State.cs

//------------------------------------------------------------------------------ 
// <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> 
//------------------------------------------------------------------------------ 

using System.ComponentModel.DataAnnotations; 

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

    public partial class PayrollMarkup_State 
    { 
     public string State { get; set; } 
     public Nullable<float> MaintenancePercentage { get; set; } 
     public Nullable<float> OfficePercentage { get; set; } 
    } 
} 

Ho quindi creato questo file in una directory diversa: "PayrollMarkup_state.cs"

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace ACore.Models 
{ 
    [MetadataType(typeof(PayrollMarkupMetadata))] 
    public partial class PayrollMarkup_State 
    { 
    } 

    public class PayrollMarkupMetadata 
    { 
     [UIHint("StatesEditor")] 
     public string State; // Has to have the same type and name as your model 
    } 
} 

risposta

21

Sebbene sia un po 'doloroso, è necessario creare una classe da utilizzare come MetadataType per la classe del modello.

[MetadataType(typeof(PayrollMarkupMetadata)) 
public partial class PayrollMarkup_State 
{ 
    ... 
} 

public class PayrollMarkupMetadata 
{ 
    [UIHint("StatesEditor")] 
    public string State; // Has to have the same type and name as your model 
    // etc. 
} 
+0

Funziona davvero se si dichiara un campo invece di una proprietà nella tua classe di metadati? – JYL

+2

@JYL sì, non guarda se si tratta di un campo o di una proprietà, è solo un meccanismo indiretto. "Trova questa cosa in quell'altra classe con questo tipo e nome e applica questi attributi ad essa." – GalacticCowboy

+0

Ok grazie! +1. – JYL

2

hai un problema dello spazio dei nomi - di aver definito due diverse classi PayrollMarkup_State, uno sotto lo spazio dei nomi ACORE e uno sotto lo spazio dei nomi ACore.Models. Cambiare lo spazio dei nomi in ACore (da ACore.Models) nel file che contiene la definizione del tipo di metadati.

+0

Hai ragione, ma @GalacticComboy ha la buona risposta originale. – JYL

0

ho usato due classi addizionali: Programma e Meta, qui è la mia mappa:

namespace Whatever.Models 
{ 
    [MetadataType(typeof(ThisMeta))] 
    public partial class This 
    { 
    } 


} 

ora qui è Metaclasse:

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 

namespace Whatever.Models 
{ 
    public class ThisMeta 
    { 

     [DisplayName("")] 
     public int UID { get; set; } 

    } 
}