2012-04-12 1 views
0

を指定検証するために、私は次のようなデモクラス "ユーザー" を持っている:あなたが見ることができるように」、Entity Frameworkの、どのように専用のプロパティ

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" }

お知らせ、I "LoginNameに" と "Pwdの" を指定しない

この機能は正常に動作することができますが、私はにValidateOnSaveEnabledを設定していないだろうfその他。

ValidateOnSaveEnabledがtrueの場合、「WebSite」のみを検証する方法はありますか?おかげさまで SaveChangesで実行

答えて

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); 
    } 

[OK]を、それは正常に動作します。

1

As I know検証は常に全体の実体を検証します。プロパティの選択的検証を行うためのトリックはコード内にコメントされていますが、SaveChanges操作の一部ではありません。

関連する問題