0

次のようなデモクラス「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​​」は「必須」です。

いつか、ユーザーの「Webサイト」だけを更新したいので、次のようにします。

    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":new User(){ID = 1、WebSite = "http://www.stackoverflow.com"}

注意、「LoginName」と「Pwd​​」は指定しません

この関数は正常に機能しますが、ValidateOnSaveEnabledをfalseに設定しません。

ValidateOnSaveEnabledがtrueの場合にのみ「WebSite」を検証する方法はありますか?ありがとう。

4

2 に答える 2

1

私が知っているように、で実行される検証はSaveChanges常にエンティティ全体を検証します。プロパティの選択的検証を取得するための秘訣はコードにコメントされていますが、これはSaveChanges操作の一部ではありません。

于 2012-04-12T10:00:18.753 に答える
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、このマネージャーをMyDbContextに追加します。

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

わかりました、それはうまくいきます。

于 2012-04-13T09:22:17.500 に答える