2012-06-20 11 views
5

Nella nostra applicazione, stiamo utilizzando il generatore di entità EF4.0 e POCO per generare entità dal database. Per applicare l'annotazione dei dati, stiamo creando interfacce e implementando tali interfacce sulle classi parziali che abbiamo creato per abbinare la classe parziale generata usando EF.Ottieni attributi personalizzati applicati alle entità generate tramite l'attributo MetadataType

/*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 
{ 
} 

Ora, utilizzando la riflessione, quando cerchiamo di ottenere se 'SomeCustomAttribute' è applicato su 'SomeEntity.SomeProperty', restituisce che l'attributo non viene applicato.

Se si modifica il codice generato e si applica direttamente l'attributo, funziona.
Se si verifica la fusione delle classi parziali per formare un singolo tipo, lo fa.
Se si verifica la presenza dell'attributo MetadataType sul tipo (mediante reflection), lo è.
Inoltre, quando l'entità è associata a qualsiasi elemento dell'interfaccia utente di WPF, le convalide funzionano come dovrebbero ma utilizzando la reflection non siamo in grado di trovare gli attributi di convalida e/o gli attributi personalizzati applicati alla proprietà.

Qualsiasi aiuto o suggerimento salverebbe un'anima.

+0

controllare questo, ho già risposto a questa domanda qui http://stackoverflow.com/a/24757520/3050647 – elia07

risposta

8

Ma l'interfaccia/classe contrassegnata con l'attributo MetadataType non aggiungerà mai quegli attributi alla classe originale in modo che non possano mai trovarli nella classe con la riflessione. Questo non è uno scopo dell'attributo MetadataType. Se si desidera utilizzare la riflessione, è necessario innanzitutto trovare l'attributo MetadataType, controllare il tipo passato a quell'attributo e cercare il proprio attributo personalizzato in quel tipo. Questo è il modo in cui la validazione utilizza MetadataType.

+0

beh, non lo sapevo. Pensavo che avrebbe collegato gli attributi applicati nei metadati con le proprietà nell'entità. Grazie per la comprensione Mi ha aiutato a modellare la soluzione. –

Problemi correlati