2012-04-12 3 views
0

Ich habe eine Demo-Klasse "User" wie folgt aus:Entity Framework, wie nur zur Validierung angeben Eigenschaft

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

... ... }

Wie Sie sehen können, " LoginName "und" Pwd "sind" Erforderlich ".

einiger Zeit, ich möchte nur Benutzers "Website" aktualisieren, so dass ich wie folgt aus:

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

Parameter "user" wie folgt aus: neuen Benutzer() { ID = 1, WebSite = „http://www.stackoverflow.com“ }

Hinweis, ich nicht angeben „Loginname“ und „Pwd“

Diese Funktion kann gut funktionieren, aber ich würde nicht gesetzt ValidateOnSaveEnabled zu f als auch.

Gibt es eine Möglichkeit, nur "WebSite" zu validieren, wenn ValidateOnSaveEnabled true ist? Danke.

Antwort

1

Ich bekomme eine Lösung. Zuerst definieren 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, Fügen Sie diese Manager zu meinen 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); 
    } 

... ...

Update-Methode:

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 es funktioniert gut.

1

As I know Validierung in SaveChanges validiert immer die gesamte Entität. Der Trick, um eine selektive Validierung für eine Eigenschaft zu erhalten, wird in Ihrem Code kommentiert, ist jedoch nicht Bestandteil der Operation SaveChanges.

Verwandte Themen