添加数据时报错:An error occurred while updating the entries. See the inner exception for detail。
场景:前几天在项目开发时,有个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。的更多相关文章
- 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.的 ...
- 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 ...
- 使用maven时报错An error occurred while filtering resources
解决办法:右键项目-->maven-->update project .
- 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# 在执行插入方 ...
- 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 ...
- 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 ...
- 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 ...
- apache include 文件包含引用的方法 报错 [an error occurred while processing this directive]
今天遇到在某平台买的虚拟主机服务器不支持 下面的这样的写法 <!--#Include file="/templets/2013new/header.htm"--> ...
- c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”
ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述 相关代码 using System; us ...
随机推荐
- 搞清楚Spring事件机制后:Spring的源码看起来简单多了
本文主讲Spring的事件机制,意图说清楚: 什么是观察者模式? 自己实现事件驱动编程,对标Spring的事件机制 彻底搞懂Spring中的事件机制,从而让大家 本文内容较长,代码干货较多,建议收藏后 ...
- docker-compose 部署 Apollo 自定义环境
Apollo 配置中心是什么: Apollo是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性. ...
- MediaStore 与Media.EXTERNAL_CONTENT_URI
MediaStore这个类是Android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取. 这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,andr ...
- Kubernetes的亲和性和反亲和性
节点亲缘性规则可以影响pod被调度到哪个节点.但是,这些规则只影响了pod和节点之间的亲缘性.然而,有些时候也希望能有能力指定pod自身之间的亲缘性. 举例来说,想象一下有一个前端pod和一个后端po ...
- Python UI自动化
Python3--Uiautomator2--Pytest--Alure使用 官方源码GitHub地址:https://github.com/openatx/uiautomator2 介绍 uiaut ...
- 基于Istio构建微服务安全加固平台的探索
简介 An open platform to connect, secure, control and observe services. Istio 是一个由谷歌.IBM 与Lyft共同开发的开源项 ...
- 29、html介绍
29.1.前端概述: 1.html.css.js之间的关系: html是页面布局,css是页面渲染,js是让页面动起来(让页面和用户进行交互): 2.浏览器访问web站点获取html页面图示: 3.h ...
- Ant Design Blazor 组件库的路由复用多标签页介绍
最近,在 Ant Design Blazor 组件库中实现多标签页组件的呼声日益高涨.于是,我利用周末时间,结合 Blazor 内置路由组件实现了基于 Tabs 组件的 ReuseTabs 组件. 前 ...
- MySQL不支持DELETE使用表别名?
最近做的需求经常和数据库在打交道, 因为系统页面上某些展示的字段并不是在前端写死的, 而是配置在数据库中, 这样的话便于维护和扩展. 于是遇到了一个MySQL中比较细节性的问题. 日常开发中不少程序员 ...
- 资源:VMware秘钥许可证
一. 激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 UG5J2-0ME12-M89WY-NPWXX-WQH88 UA5DR-2ZD4H-089FY-6YQ5T-YPRX6 GA ...