2012-06-20 89 views
5

在我們的應用程序中,我們使用EF4.0和POCO實體生成器從數據庫生成實體。爲了應用數據註解,我們創建接口並在我們創建的部分類上實現這些接口,以匹配使用EF生成的部分類。通過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 
{ 
} 

現在,使用反射,當我們試圖如果「SomeCustomAttribute」是在「SomeEntity.SomeProperty」適用於獲得,它返回不應用屬性。

如果我們編輯生成的代碼並直接應用Attribute,它就可以工作。
如果我們檢查部分類合併形成一個單一的類型,它會。
如果我們檢查要應用於類型的MetadataType屬性(使用反射),它是。另外,當實體綁定到任何WPF的UI-Element時,驗證將按照他們應該的方式工作,但使用反射我們無法找到應用於屬性的驗證屬性和/或自定義屬性。

任何幫助或指針都會拯救靈魂。

+0

檢查了這一點,我已經在這裏回答了這個問題 http://stackoverflow.com/a/24757520/3050647 – elia07

回答

8

但標記爲MetadataType屬性的界面/類永遠不會將這些屬性添加到您的原始類,因此您永遠無法在反射類上找到它們。這不是MetadataType屬性的目的。如果您想使用反射,您必須首先找到MetadataType屬性,檢查傳遞給該屬性的類型並搜索該類型中的自定義屬性。這就是驗證如何使用MetadataType

+0

以及我不知道這一點。我認爲它會將元數據中應用的屬性與實體中的屬性相關聯。感謝您的理解。它幫助我塑造瞭解決方案。 –