2012-04-12 25 views
0

我有一個演示類 「用戶」 這樣的:實體框架,如何只驗證指定屬性

public partial class User { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [StringLength(30)] 
    [Required] 
    public string LoginName { get; set; } 

    [StringLength(120)] 
    [Required] 
    [DataType(DataType.Password)] 
    public string Pwd { get; set; } 

    [StringLength(50)] 
    public string Phone { get; set; } 

    [StringLength(100)] 
    public string WebSite { get; set; } 

... ... }

正如你所看到的,「 LoginName「和」Pwd「是」必需的「。

一段時間,我只想更新用戶的 「網」,所以我這樣做:

public void UpdateUser(User user , params string[] properties) { 
     this.rep.DB.Users.Attach(user); 
     this.rep.DB.Configuration.ValidateOnSaveEnabled = false; 
     var entry = this.rep.DB.Entry(user); 
     foreach(var prop in properties) { 
      var entProp = entry.Property(prop); 
      //var vas = entProp.GetValidationErrors(); 
      entProp.IsModified = true; 
     } 
     this.rep.DB.SaveChanges(); 
     this.rep.DB.Configuration.ValidateOnSaveEnabled = true; 
    } 

參數 「用戶」 是這樣的: 新用戶(){ ID = 1, 網頁=「http://www.stackoverflow.com」 }

通知,我不指定「的LoginName」和「密碼」

此功能可以正常工作,但我不會設置ValidateOnSaveEnabled到F ALSE。

當ValidateOnSaveEnabled爲true時,有沒有什麼辦法可以驗證「WebSite」? 謝謝。

回答

1

我得到一個解決方案。 首先定義PartialValidationManager:

public class PartialValidationManager { 

    private IDictionary<DbEntityEntry , string[]> dics = new Dictionary<DbEntityEntry , string[]>(); 

    public void Register(DbEntityEntry entry , string[] properties) { 
     if(dics.ContainsKey(entry)) { 
      dics[entry] = properties; 
     } else { 
      dics.Add(entry , properties); 
     } 
    } 

    public void Remove(DbEntityEntry entry) { 
     dics.Remove(entry); 
    } 

    public bool IsResponsibleFor(DbEntityEntry entry) { 
     return dics.ContainsKey(entry); 
    } 

    public void ValidateEntity(DbEntityValidationResult result) { 
     var entry = result.Entry; 
     foreach(var prop in dics[entry]){ 
      var errs = entry.Property(prop).GetValidationErrors(); 
      foreach(var err in errs) { 
       result.ValidationErrors.Add(err); 
      } 
     } 
    } 
} 

2,這個管理器添加到我的DbContext:

public class XmjDB : DbContext { 

    public Lazy<PartialValidationManager> PartialValidation = new Lazy<PartialValidationManager>(); 

    protected override System.Data.Entity.Validation.DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry , IDictionary<object , object> items) { 
     if(this.PartialValidation.Value.IsResponsibleFor(entityEntry)) { 
      var result = new DbEntityValidationResult(entityEntry , new List<DbValidationError>()); 
      this.PartialValidation.Value.ValidateEntity(result); 
      return result; 
     } else 
      return base.ValidateEntity(entityEntry , items); 
    } 

... ...

更新方法:

public void UpateSpecifyProperties(T t, params string[] properties) { 
     this.DB.Set<T>().Attach(t); 
     var entry = this.DB.Entry<T>(t); 
     this.DB.PartialValidation.Value.Register(entry , properties); 
     foreach(var prop in properties) { 
      entry.Property(prop).IsModified = true; 
     } 
     this.DB.SaveChanges(); 
     this.DB.PartialValidation.Value.Remove(entry); 
    } 

好,它工作正常。

1

As I knowSaveChanges中執行的驗證總是驗證整個實體。對代碼進行選擇性驗證的技巧在您的代碼中進行了評論,但它不是SaveChanges操作的一部分。