2013-03-25 10 views
21

Wie kann ich Datenanmerkungen am besten zur Validierung verwenden, wenn ich eine erste Entity Framework (v5.0) -Datenbank verwende?Datenanmerkungen mit Entity Framework 5.0 (erste Datenbank)

Dies ist mein Teilklasse von Entity Framework erstellt:

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

habe ich versucht, dies ohne Erfolg ....

Entity Framework-Datei generiert:

//------------------------------------------------------------------------------ 
// <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; } 
    } 
} 
'PayrollMarkup_State.cs'

Ich habe dann diese Datei in einem anderen Verzeichnis erstellt: '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 
    } 
} 

Antwort

21

Obwohl es etwas schmerzhaft ist, müssen Sie eine Klasse erstellen, die als MetadataType für Ihre Modellklasse verwendet werden kann.

[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

Funktioniert das wirklich, wenn Sie erklären ein Feld anstelle einer Eigenschaft in Ihrer Metadatenklasse? – JYL

+2

@JYL Ja, es sieht nicht aus, ob es ein Feld oder eine Eigenschaft ist, es ist nur ein indirekter Mechanismus. "Finden Sie dieses Ding in dieser anderen Klasse mit diesem Typ und Namen und wenden Sie diese Attribute darauf an." – GalacticCowboy

+0

Ok danke! +1. – JYL

2

Sie haben ein Namespace Problem - Sie zwei verschiedene PayrollMarkup_State Klassen definiert hat, eine unter dem ACORE Namespace und einem unter dem ACore.Models Namespace. Ändern Sie den Namespace in ACore (von ACore.Models) in der Datei, die die Metadatentypdefinition enthält.

+0

Sie haben Recht, aber @GalacticComboy hat die ursprüngliche gute Antwort. – JYL

0

ich zwei zusätzliche Klassen verwendet: Karte und Meta, hier ist meine Karte:

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


} 

jetzt hier ist Meta-Klasse:

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

namespace Whatever.Models 
{ 
    public class ThisMeta 
    { 

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

    } 
}