2016-02-09 24 views
0

我需要添加dataannotation屬性到我的實體,但我的實體以外。爲什麼?我所有的類都是由T4生成的,如果我向屬性添加一些數據註解(DisplayName,Min,Max等),當我重新運行T4生成我的實體時,它們將會丟失。我希望實體由T4生成,然後在另一個類中執行如下操作:添加DataAnnotations到實體類以外的屬性

Dog.Name.AddDataannotation(new DisplayNameDataAnnotation(「My dog」));

類會是這樣的

public class Dog 
{ 
    public int DogId { get; set; } 
    public string Name { get; set; } 
} 

它會像對dataannotations一口流利的API。這樣我就可以將我的數據註解從我的實體中分離出來,我可以在不丟失它們的情況下重新生成它們。如果有人問我不能使用DTO。另一件事,我有一個基於DataAnnotations驗證實體的類,我想繼續工作。

是否有可能做到這樣的事情?

感謝和抱歉我的英語!

回答

1

MetadataTypeAttribute旨在處理這種情況。這不是很好,但應該工作。

採取的步驟如下:

  • 確保您生成的類型是partial
  • 對於您要添加元數據,添加一個新的部分類定義每種類型,指定[MetadataType](如[MetadataType(typeof(DogMetadata))]]
  • 重新定義的屬性在DogMetadata,添加屬性有

完全EXA簡單:

//dog.generated.cs 
partial class Dog 
{ 
    public int DogId { get; set; } 
    public string Name { get; set; } 
} 

//dog.cs 
[MetadataType(typeof(DogMetadata))] 
partial class Dog {} 

class DogMetadata 
{ 
    [DisplayName("My dog")] 
    public string Name { get; set; } 
} 
+0

哇,太可怕了!!!我不是說你的回答(很好的答案),處理場景的方式!但是有一個問題,在我的理想場景Dog.Name.AddDataannotation(新的DisplayNameDataAnnotation(「My dog」))中,將Dog類的Name屬性更改爲Name1。會拋出異常,因爲Name更改爲Name1。在示例中,您向我展示了這不會發生,Dog類將從生成的代碼獲取Name(來自元數據)和Name1。我的解釋是否正確?如果我的解釋沒問題,那麼我需要說我不希望發生這種情況! – snekkke

+0

你是對的,那種情況將會慘敗。您可以進行一次單元測試,檢查metadatatype屬性與原始屬性,以確保它們存在。 – Bas

+0

嘿,那個很好!但是,如果兩者都是DOG類,你如何做比較? – snekkke

相關問題