2012-04-12 4 views
0

У меня есть демо-класс "User", как следующее: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 "являются обязательными.

Некоторое время, я только хочу, чтобы обновить пользователя "WebSite", так что я, как это:

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, WebSite = «http://www.stackoverflow.com» }

Заметьте, я не указываю «LOGINNAME» и «Pwd»

Эта функция может работать нормально, но я бы не установил ValidateOnSaveEnabled в е Alse.

Есть ли какой-либо способ только проверить «WebSite», когда ValidateOnSaveEnabled является истинным? Спасибо.

ответ

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

... ...

Метод Update:

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, всегда проверяет целостность объекта. В вашем коде комментируется трюк, чтобы получить выборочную проверку свойства, но он не является частью операции SaveChanges.

Смежные вопросы