实体框架,如何只验证指定属性

时间:2012-04-12 09:42:54

标签: entity-framework validation

我有一个演示类“User”,如下所示:

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

参数“user”是这样的: 新用户(){  ID = 1,  WebSite =“http://www.stackoverflow.com” }

注意,我没有指定“LoginName”和“Pwd”

此函数可以正常工作,但我不会将ValidateOnSaveEnabled设置为false。

当ValidateOnSaveEnabled为true时,有没有办法只验证“WebSite”? 感谢。

2 个答案:

答案 0 :(得分:1)

SaveChanges中执行的

As I know验证始终验证整个实体。获取属性选择性验证的技巧在您的代码中被注释,但它不是SaveChanges操作的一部分。

答案 1 :(得分: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);
    }

好的,它运作正常。