2012-06-20 4 views
5

In unserer Anwendung verwenden wir EF4.0 und den POCO-Entitätsgenerator zum Generieren von Entitäten aus der Datenbank. Um die Annotation von Daten anzuwenden, erstellen wir Interfaces und implementieren diese Interfaces für die partiellen Klassen, die wir erstellt haben, um sie an die partielle Klasse anzupassen, die mit EF generiert wurde.Abrufen von benutzerdefinierten Attributen für generierte Entitäten über das MetadataType-Attribut

/*Entity Generated Type*/ 
public partial class SomeEntity : EntityBase 
{ 
    public virtual string SomeProperty 
    { 
     get {...} 
     set {...} 
    } 
} 

/*Interface containing metadata*/ 
public interface ISomeEntityMetadata 
{ 
    [SomeCustomAttribute] 
    string SomeProperty { get; set; } 
} 

/*Partial matching class for interface*/ 
[MetadataType(typeof(ISomeEntityMetadata))] 
public partial class SomeEntity : ISomeEntityMetadata 
{ 
} 

nun mit Reflexion, wenn wir zu erhalten versuchen, wenn ‚SomeCustomAttribute‘ auf ‚SomeEntity.SomeProperty‘ angewendet wird, gibt es, dass das Attribut nicht angewendet wird.

Wenn wir den generierten Code bearbeiten und das Attribut direkt anwenden, funktioniert es.
Wenn wir prüfen, ob die partiellen Klassen zu einem einzigen Typ verschmelzen, ist dies der Fall.
Wenn wir nach dem MetadataType-Attribut suchen, das auf den Typ angewendet wird (mit Reflektion), ist es das.
Wenn die Entität an das UI-Element einer WPF gebunden ist, funktionieren die Validierungen ebenfalls wie erwartet, aber mithilfe der Reflektion können wir die Validierungsattribute und/oder benutzerdefinierten Attribute nicht finden, die auf die Eigenschaft angewendet wurden.

Jede Hilfe oder Hinweise würde eine Seele retten.

+0

Check dies diese aus, ich beantwortet diese Frage bereits hier http://stackoverflow.com/a/24757520/3050647 – elia07

Antwort

8

Aber Schnittstelle/Klasse markiert mit MetadataType Attribut wird nie diese Attribute zu Ihrer ursprünglichen Klasse hinzufügen, so dass Sie sie nie auf der Klasse mit Reflexion finden können. Das ist kein Zweck von MetadataType Attribut. Wenn Sie die Reflektion verwenden möchten, müssen Sie zuerst das Attribut MetadataType finden, den an dieses Attribut übergebenen Typ prüfen und nach Ihrem benutzerdefinierten Attribut in diesem Typ suchen. So verwendet die Validierung MetadataType.

+0

gut ich das nicht wusste war. Ich dachte, es würde die Attribute in den Metadaten mit Eigenschaften in der Entität anfügen. Vielen Dank für Ihr Verständnis. Es hat mir geholfen, die Lösung zu gestalten. –