EF更新部分实体属性保存时,实体其他属性的验证特型出现验证异常问题的解决办法
EF更新部分实体属性保存时,实体其他属性的验证特型出现验证异常问题的解决办法
夙歆风 发表于1年前
EF更新部分实体属性保存时,实体其他属性的验证特型出现验证异常问题的解决办法
  • 发表于 1年前
  • 阅读 29
  • 收藏 1
  • 点赞 1
  • 评论 0

       EF的特性允许修改实体的部分属性而不用去查询实体。

       如下代码:

var dbSet = db.Set<Entity>();

var m = new Feedback
{
    Id = 5,
    FunctionPoint = "FunctionPoint",
    Comments = "Comments",
    Contact = "Contact"
};

//将当前实体附加到上下文中
var entity = dbSet.Attach(m);

var entry = db.Entry(entity);
//重置实体状态为没有变化,如同刚从数据库中查询出来一样
entry.State = EntityState.Unchanged;

//设置实体属性
entity.FunctionPoint = "FunctionPoint";
entity.Contact = "Contact";
entity.Comments = "Comments";

//设置某些属性的状态为发生变化
entry.Property(a => a.FunctionPoint).IsModified = true;
entry.Property(a => a.Contact).IsModified = true;
entry.Property(a => a.Comments).IsModified = true;

//保存实体变更
var count = db.SaveChanges();

        但当实体模型的其他属性有诸如Required等验证特性时,执行SaveChanges方法会引起验证错误,因为当前实体的其他属性均为null,无法通过验证。

        网上查到的办法多为将ValidateOnSaveEnabled属性设为false关闭实体的自动验证功能,但此法却也失去了EF带来的实体自动验证的优点。

       本文的办法是通过重写 DbContext 的 ValidateEntity 方法,使其在执行SaveChanges方式保存实体的实体验证时只验证发生了变化的实体属性。(也就是移除所有没有变化的属性的验证错误信息)

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
    //当实体不为null且实体状态为已发生变化时执行
    if (entityEntry != null && entityEntry.State == EntityState.Modified)
    {
        //获取实体验证结果
        var ValidateEntity = base.ValidateEntity(entityEntry, items);
        //获取实体当前属性的属性名称列表
        var PropertyNames = ValidateEntity.Entry.CurrentValues.PropertyNames;
 
        foreach (var PropertyName in PropertyNames)
        {
            //判断当前属性的值是否发生了变化
            if (ValidateEntity.Entry.Property(PropertyName).IsModified == false)
            {
                //如果当前实体属性未发生变化,则查询验证结果中该属性的验证错误信息
                var ve = ValidateEntity.ValidationErrors.FirstOrDefault(a => a.PropertyName == PropertyName);
                //如果获取的该实体当前属性的验证错误信息存在,则从验证错误信息中移除它
                if (ve != null) {
                    ValidateEntity.ValidationErrors.Remove(ve);
                }
                
            }
        }
        //返回最终的验证结果
        return ValidateEntity;
    }
    else
    {
        return base.ValidateEntity(entityEntry, items);
    }
     
}

 

标签: EF
共有 人打赏支持
粉丝 0
博文 1
码字总数 526
×
夙歆风
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: