文档章节

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

夙歆风
 夙歆风
发布于 2016/08/13 23:37
字数 526
阅读 38
收藏 1
点赞 1
评论 0
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
成都
程序员
七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

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

葡萄城控件技术团队
2015/06/30
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
EntityFramework 7 更名为EntityFramework Core(预发布状态)

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

jeffcky
2016/03/13
0
0
EntityFramework Core解决并发详解

前言 对过年已经无感,不过还是有很多闲暇时间来学学东西和多陪陪爸妈,这一点是极好的,好了,本节我们来讲讲EntityFramework Core中的并发问题。 话题(EntityFramework Core并发) 对于并...

jeffcky
2017/01/18
0
0
MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

上篇文章中 我们已经创建了EF4.1基于code first的例子 有了数据库 并初始化了一些数据 今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建详细页...

postdep
2014/02/08
0
0
Entity Framwwork Code First

借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型。模型的基本形状可通过约定来检测。约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型。约定是在 System...

BryanYang
2014/03/31
0
0
EntityFramework Core问题处理集锦(一)

前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨...

jeffcky
2017/08/06
0
0
【翻译】安卓架构组件(6)-Room持久化类库

相关文章: 【翻译】安卓架构组件(1)-App架构指导 【翻译】安卓架构组件(2)-添加组件到你的项目中 【翻译】安卓架构组件(3)-处理生命周期 【翻译】安卓架构组件(4)-LiveData 【翻译】安卓架构...

Chuckiefan
2017/06/07
0
0
EF架构~FluentValidation实体检验与实体分离了

在MVC,EF,LINQ环境里,我们经常会用到DataModel(DO)和ViewModel(VO),可能对于它们的属性校验我们会采用特性的方式,当然这很直观,就连微软的DEMO也是如些,一般是这样的代码 /// 而这种设...

mcy247
2017/12/05
0
0
EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和E...

jeffcky
2016/12/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Iterm2安装Zsh + Oh My Zsh+Solarized

安装Oh My Zsh curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh 安装Zsh: 1.安装zsh brew install zsh 2.配置iterm2 sudo vim /etc/shells输入:......

孟飞阳
7分钟前
0
0
缓解ddos攻击的有效解决办法

因为防火墙无法处理所有类型的ddos攻击,下一代防火墙生成内置的DDoS防御,但是无法处理所有类型的攻击。对抗DDoS攻击的最佳做法是有专属的设备或者服务在攻击透过防火墙或者其他的IT基础设施...

上树的熊
8分钟前
0
0
Spark Streaming如何使用checkpoint容错

在互联网场景下,经常会有各种实时的数据处理,这种处理方式也就是流式计算,延迟通常也在毫秒级或者秒级,比较有代表性的几个开源框架,分别是Storm,Spark Streaming和Filnk。 伦理片 http...

刺猬一号
9分钟前
1
0
Xamarin Essentials教程地理定位Geolocation

Xamarin Essentials教程地理定位Geolocation 通过地理定位功能,应用程序可以获取用户的当前地理位置,如经纬度值。利用地理位置,可以在地图上定位,也可以转化物理位置,划分用户的归属地。...

大学霸
22分钟前
0
0
vue 编译警告 Compiled with 4 warnings

There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing.......

落雪飞声
26分钟前
0
0
开篇文章,长期记录安全情形

密码位置 密码位于注释中 密码位于服务器端文件中 通过访问根目录下.htaccess、robots.txt查看禁查路径 密码文件可能存在的路径:/、/extra/、/extras/ 密码加密 binary to base16 sha256 彩虹...

hirainn
39分钟前
0
0
mysql数据库设置root可以远程登录的方法

mysql数据库设置root可以远程登录的方法 Posted on 2018-02-21 21:08 sishuisufeng 阅读(161) 评论(0) 编辑 收藏 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如...

rootliu
44分钟前
1
0
TensorFlow 图的基本操作

图的创建,一般只需要使用默认图就能满足大部分的需求了 # 1 创建图的方法# 在默认图中创建常量c = tf.constant(0.0)# 新建一个图g = tf.Graph()# 设置上下文管理器,标明操作...

阿豪boy
今天
0
0
git 忽略文件失效

git update-index --assume-unchanged */.project

林子大鸟
今天
1
0
实现验证码功能

1、实现验证码,并存储 import com.dtb.pc_enterprise.entity.EnterUserEntity;import com.dtb.pc_enterprise.service.AdminService;import com.dtb.pc_enterprise.util.RedisService;......

木九天
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部