2011-05-25 182 views
3

我想要使用驗證註釋。 我已經有一個由實體框架實現的模型。 我需要數據驗證,我知道有一個數據anotation是非常好的... 但我真的不知道如何使用它與實體框架正確。實體框架+驗證註釋

我應該編輯實體嗎?或者我應該寫分離的課程?或者我應該編寫從實體繼承的類?

你能告訴我我應該使用的最好方法嗎?

我想盡可能地寫出儘可能少的代碼。

+1

要添加什麼樣的驗證?你能告訴我們一些課程代碼嗎? – 2011-05-25 14:00:42

回答

14

處理此問題的方法是分部類和允許您將元數據附加到另一個類的特殊屬性的組合。

實體框架已經通過生成所有類爲部分類來幫助您。所以,如果你有在你的模型所調用的設置一個實體,在EF會造成這樣的:

public partial class Setting : INotifyPropertyChanging, INotifyPropertyChanged 
{ 
    // Auto-gen Properties, methods, etc go here. 
} 

這意味着你可以有任意數量的其他文件等partial class Setting片段,其中EF不會,如果觸碰/時您重新生成該代碼。如果要爲此添加數據驗證屬性,則需要兩步:

  1. 將MetadataType屬性附加到Setting類。這部分類片段的主體中不需要有任何內容,它只是在那裏關聯屬性。

    [MetadataType(typeof(SettingMetadata))] 
    public partial class Setting 
    { 
    } 
    
  2. 創建具有相同的公共字段名稱爲EF類,你想要的任何數據驗證屬性第二類,和準。編譯器會按照名稱將元數據類字段與EF類字段進行匹配,並將它作爲第一個類的任何元數據附加到第二個類。

    public class SettingMetadata 
    { 
        [Display(Name="Base Rate")] 
        [Required] 
        public decimal Rate 
        { 
         get; 
         set; 
        } 
    
        [Display(Name = "Permit Payments")] 
        public Boolean AllowPayments 
        { 
         get; 
         set; 
        } 
    
        [Display(Name = "Base URL For Web Service")] 
        [Required] 
        [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "Type must match linked metadata type.")] 
        public string WebServiceUrl 
        { 
         get; 
         set; 
        } 
    } 
    

如FxCop的抑制消息中提到,該名稱並鍵入字段的必須爲此工作的元數據類和相關聯的類之間匹配。

2

數據註釋是您需要添加到實體屬性的驗證器屬性。有許多標準屬性,或者如果它們不能滿足您的需求,可以創建自定義屬性。

Check this link.