文档章节

EF更新部分实体属性保存时,实体其他属性的验证特型出现验证异常问题的解决办法

夙歆风
 夙歆风
发布于 2016/08/13 23:37
字数 526
阅读 41
收藏 1
EF

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

 

© 著作权归作者所有

共有 人打赏支持
夙歆风
粉丝 0
博文 1
码字总数 526
作品 0
成都
程序员
私信 提问
在EF中使用Expression自动生成p=>new Entity(){X="",Y="",..}格式的Lambda表达式灵活实现按需更新

一、基本介绍 回忆:最早接触Expression是在学校接触到EF的时候,发现where方法里的参数是Expression>这么一个类型,当初也只是看到了,也没有过多的去探究,只是知道传入lambda表达式使用即...

含光君
09/26
0
0
七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能。 系列文章 七天学会ASP.NET MVC...

葡萄城控件技术团队
2015/06/30
0
0
ABP之什么是ABP(ASP.NET Boilerplate)

1.介绍 ABP是开源的且文档比较齐全的应用程序框架。其实它不仅仅是个框架,考虑其最佳实践,ABP更提供了基于领域驱动设计(DDD)的强大价格模型。 ABP支持最新的ASP.NET Core和EF Core,同时...

Freda.Han
08/15
0
0
EntityFramework 7 更名为EntityFramework Core(预发布状态)

前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园...

jeffcky
2016/03/13
0
0
YMP v2.0.0 发布,轻量级 Java 应用开发框架

自YMP v2.0GA版本发布至今,在经历近一年时间不断的优化完善,今天,正式发布YMP v2.0.0版! YMP是一个非常简单、易用的轻量级Java应用开发框架,涵盖AOP、IoC、WebMVC、ORM、Validation、P...

有理想的鱼
2017/02/07
4.2K
5

没有更多内容

加载失败,请刷新页面

加载更多

(三)Honghu Cloud云架构一定时调度平台

2018-11-16 14:45:08 产品简介 鸿鹄云架构是一个完全由Java编写的开源任务调度框架,为企业在任务调度提供了简单却强大的机制。开发人员根据业务规则,使用调度平台简单配置,就可以让任务在...

itcloud
6分钟前
0
0
护航Lazada双11购物节 阿里云CDN全球化火力全开

摘要: Lazada是东南亚最大B2C平台,业务范围覆盖印度尼西亚、马来西亚、菲律宾、新加坡、泰国和越南六个东南亚国家,覆盖大约6亿消费者。在双11期间,阿里云CDN为Lazada电商内容加速,并且通...

阿里云官方博客
6分钟前
0
0
常用设计模式之代理模式解析

1. 简介 代理模式(Proxy Pattern)是常用设计模式之一。代理模式的定义:Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个...

老道士
6分钟前
0
0
Vue瀑布流插件的使用示例

我自己写的一个的Vue瀑布流插件,列数自适应,不用设置每个卡片的高度。 测试页面:Page.vue 模板页面:WaterFollow.vue 和 WFColumn.vue 在Page.vue中,修改itemW的值,设置每列的最小宽度。...

peakedness丶
7分钟前
0
0
多种负载均衡算法及其Java代码实现【网络上较好的转载】

首先给大家介绍下什么是负载均衡(来自百科) 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽、增加 吞吐量、加强网络数据处理能力、提高网...

stys352
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部