2012-04-12 66 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操作的一部分。