场景:前几天在项目开发时,有个bug经常出现,今天花了一整天,终于把它解决了。记录一下解决流程。

解决方法:

  主要报错的地方在添加的部分:

 1 foreach (var requestProperty in request.Properties)
2 {
3 UnitWork.Add(new Relevance
4 {
5 Key = Define.ROLEDATAPROPERTY,
6 FirstId = request.RoleId,
7 SecondId = request.ModuleCode,
8 ThirdId = requestProperty,
9 OperateTime = DateTime.Now
10 });UnitWork.save();
11 }

  这里的UnitWork(事务类)的Add()方法主要实现“上下文”的以下代码:

1 _context.Set<T>().Add(entity);

  而Save()实现以下代码:

1 _context.SaveChanges();

  我查了半天的问题,发现报错都是:An error occurred while updating the entries. See the inner exception for detail。同时我打印了是哪个实体类的问题,发现每次实体类都不一样。由于在这之前做了删除的操作,一开始我以为是删除的操作,可能是数据库中数据没删干净就开始添加,或者还没删完就开始添加,导致上下文对同一数据操作。后来跟踪了一下断点,查看一下数据库,发现删除的数据和添加的数据没有关系。然后我猜会不会是UnitWork的问题,于是我用了Repository的Add(),其代码如下;

1  public void Add(T entity)
2 {
3 _context.Set<T>().Add(entity);
4 _context.SaveChanges();
5 _context.Entry(entity).State = EntityState.Detached;
6 }

  和unitWork不同的是,这里的Add()方法中多加了一句:对上下文实体类状态的操作。运行,发现成功了,没有报错。原来是Entry.State的关系。

原理:

  先介绍一下实体的State:

Unchanged 未修改。在加载到上下文后未修改
Modified 已修改。已经修改,但是没有使用savechange()
Deleted 已删除。从上下文中删除了对象,但是没有使用savechange()
Added 新添加。对象已经添加到上下文,但没有使用但是没有使用savechange()
Detached 游离态。对象存在,但不被上下文跟踪

  以我个人的理解,那么添加数据的过程应该为:

        1.先添加一个新的对象,此时是状态为Detached,和数据库,上下文都没关系;

        2.采用上下文的Add()添加对象,对象已经添加到上下文,此时状态为Added,但是没有savechange(),数据库中没有该数据;

        3.上下文的savechange(),即同步数据库和上下文。此时该数据状态为Unchanged,数据库中有该数据;

        4.若把对象的State改为Detached,则上下文中没有该对象。不然,对象的State为Unchanged,存在于上下文中。

  因此,我猜测是在UnitWork添加的时候,在上下文中依旧有数据对象,然后在对其操作时(我这里时删除数据)导致不能更新数据。但是具体为什么会报错,不是很理解,希望可以讨论学习一下。

添加数据时报错:An error occurred while updating the entries. See the inner exception for detail。的更多相关文章

  1. An error occurred while updating the entries. See the inner exception for details.

    EF插入或更新数据时出现错误提示:An error occurred while updating the entries. See the inner exception for details.的 ...

  2. EF更新时出错,An error occurred while updating the entries. See the inner exception for details

           在使用EF进行更新数据时出错,报出的异常是 "An error occurred while updating the entries. See the inner excep ...

  3. 使用maven时报错An error occurred while filtering resources

    解决办法:右键项目-->maven-->update project   .

  4. C# an error has occurred while updating the entries.see the log file

    message:An error occurred while updating the entries. See the inner exception for details. C# 在执行插入方 ...

  5. pycharm添加wordcloud模块时报错:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    windows 7 32bit python3.6.3 32bit pycharm2018社区版 32bit 问题说明: 添加wordcloud模块时报错:error: Microsoft Visua ...

  6. MyEclipse for Spring启动时报错"An internal error occurred during: 'Updating indexes'.Java heap space"的解决办法

    问题 MyEclipse for Spring在启动时,报如下错误:An internal error occurred during: 'Updating indexes'.Java heap sp ...

  7. MySQL 导入外部数据时报错:1153: Got a packet bigger than 'max_allowed_packet' 解决方案

    MySQL 导入外部数据时报错:1153: Got a packet bigger than 'max_allowed_packet' 解决方案 zoerywzhou@163.com http://w ...

  8. apache include 文件包含引用的方法 报错 [an error occurred while processing this directive]

    今天遇到在某平台买的虚拟主机服务器不支持    下面的这样的写法 <!--#Include file="/templets/2013new/header.htm"--> ...

  9. c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”

    ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述     相关代码 using System; us ...

随机推荐

  1. 好用的Java工具类库,GitHub星标10k+你在用吗?

    简介 Hutool是Hu + tool的自造词,前者致敬我的"前任公司",后者为工具之意,谐音"糊涂",寓意追求"万事都作糊涂观,无所谓失,无所谓得& ...

  2. 想玩转JAVA高并发,这些概念你必须懂

    高并发高并发 它是互联网分布式系统架构设计中必须考虑的因素之一,通常是指,保证系统能够同时并行化处理海量请求 同步和异步 同步:发送一个请求,等待返回,然后再发送下一个请求.提交请求 -> 等待 ...

  3. Python 机器学习实战 —— 监督学习(下)

    前言 近年来AI人工智能成为社会发展趋势,在IT行业引起一波热潮,有关机器学习.深度学习.神经网络等文章多不胜数.从智能家居.自动驾驶.无人机.智能机器人到人造卫星.安防军备,无论是国家级军事设备还是 ...

  4. 聊聊IOC中依赖注入那些事 (Dependency inject)

    What is Dependency injection 依赖注入定义为组件之间依赖关系由容器在运行期决定,形象的说即由容器动态的将某个依赖关系注入到组件之中在面向对象编程中,我们经常处理的问题就是解 ...

  5. react 中的PropTypes与DefaultProps

    每个组件都有自己的props参数,这参数是从父组件接收的一些属性.那我们应该如何对参数的类型做校验,如何定义参数的默认值呢? 1.使用PropTypes校验父组件传过来的参数是否合法 import P ...

  6. DL基础补全计划(一)---线性回归及示例(Pytorch,平方损失)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. Redis的事务不是原子性的

    1.事务的四大特性 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节. ...

  8. C# 实现复制Excel内容到DataGridview中

    业务要求:复制:将Excel内容复制到datagridview中 最终效果:复制Excel内容,点击datagridview中的某个单元格,顺着这个单元格自动填充自动增加行.偷懒了,没写填充在选择哪些 ...

  9. Nginx-多服务绑定80端口及映射域名

    多服务绑定80端口及映射域名 说明:业务需要配置的样例模板,如需深入了解,请查看官方文档 1.Nginx配置文件nginx.conf(可拆分多台机器部署) worker_processes  1; e ...

  10. CentOS-Docker搭建Nextcloud

    下载镜像 $ docker pull nextcloud 运行镜像 $ docker run -d --restart=unless-stopped --name nextcloud -v /home ...