EntityFramework批量插入数据遇到一个百思不得解的问题

问题描述

异常:对数据库所做的更改已成功提交,但在更新对象上下文时出错。此ObjectContext可能处于不一致状态。内部异常消息:AcceptChanges无法继续,因为该对象的键值与ObjectStateManager中的另一个对象冲突。请在调用AcceptChanges之前,确保键值是唯一的。循环插数据第一个不会报错,第二条才报错问题肯定出在内存中有ObjectStateManager版本值不一样的对象,可是问题出现在这就奇怪了,我明明是实例化的一个新实体啊,为什么啊为什么查看数据表,数据确实批量上去了,就是在AcceptChanges方法提交时报个异常

解决方案

解决方案二:
急!!!!在线等
解决方案三:

解决方案四:
是不是你的表包含外键,如果包含外键添加的时候需要设置外键属性
解决方案五:
主键未赋值?今天遇到这个问题了,EF+Oracle开发,主键使用自增ID,结果就报错了,后面给每条数据设置ID,就没问题了。
解决方案六:
看看你的框架结构是不是改过?和数据库的不一致了。
解决方案七:
引用楼主wwwiii520的回复:

异常:对数据库所做的更改已成功提交,但在更新对象上下文时出错。此ObjectContext可能处于不一致状态。内部异常消息:AcceptChanges无法继续,因为该对象的键值与ObjectStateManager中的另一个对象冲突。请在调用AcceptChanges之前,确保键值是唯一的。循环插数据第一个不会报错,第二条才报错问题肯定出在内存中有ObjectStateManager版本值不一样的对象,可是问题出现在这就奇怪了,我明明是实例化的一个新实体啊,为什么啊为什么查看数据表,数据确实批量上去了,就是在AcceptChanges方法提交时报个异常

我也遇到了这个问题了,我也不知道该如何解决,我是在触发器中完成的这些功能,但是严重的影响到了性能。具体你可以看报错。我们的每个新生成的查询返回的实体,都被保存在Context的容器中的缓存中(也就是ObjectContext),则ObjectStateManager负责管理它们的状态。而AcceptAllChangesAfterSave:就是把数据保存到数据库以后重置实体的状态。这就说明缓存的时候就是不对的,所以在ObjectStateManager分配的时候会冲突,并且无法重置实体状态。

时间: 2024-08-03 02:42:41

EntityFramework批量插入数据遇到一个百思不得解的问题的相关文章

详解C#批量插入数据到Sqlserver中的四种方式_C#教程

本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database C

c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入

问题描述 c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入 c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入. 并且报错,哪几天数据失败了.和失败的原因. 我现在是可以生成一个把一个数据库表的数据导入到另一个数据库表中.但是呢,有些数据由于某个字段过长无法导入成功,而导致所有的都无法导入.直接造成导入失败.我 想过滤掉那条不成功的继续导入.不至于都导入不成功.急! 想和好久也没解决.网上也没找到说法 解决方案 数据库表插入数据失败数据库批量

Java实现mybatis批量插入数据到Oracle_java

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址  1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &

sql下三种批量插入数据的方法_MsSql

本文将介绍三种批量插入数据的方法.第一种方法是使用循环语句逐个将数据项插入到数据库中:第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表:第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server 2008 中的新参数类型.表值参数是使用用户定义的表类型来声明的.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据.       代码示例:    

java实现jdbc批量插入数据_java

首先介绍三种JDBC批量插入编程方法,进行比较,具体内容如下 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一:使用PreparedStatement加批量的方法 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(o_url, userName, pass

Hibernate批量插入数据到数据库

之前笔记中使用jdbc和iBATIS方式实现批量插入数据到数据库.在Hibernate框架中使用相应接口,同样也可以实现数据的批量操作,Hibernate把最近插入的数据都以session-level cache在内存做缓存,首先在配置文件中设置一个合理的JDBC批处理大小hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量.配置hibernate.jdbc.batch_size参数的原因就是尽量少读数据库,hibernate.jdbc.batch_size参数值越

C#批量插入数据到Sqlserver中的三种方式_C#教程

本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database C

Android批量插入数据性能优化

做数据同步时遇到一个问题,在下载数据时需要批量的向sqlite插入数据,虽然数据不算多,但是实际测试中每插入一条数据需要将近50ms的时间,这意味着1000条数据就需要花费50s左右的时间,对于用户来说,体验太差了,必须要优化. 在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.明白了这个,解决方案就有了,在批量插入数据的时候,只开启一个事务,这样只会进行一次磁盘操作,代码如下: db.beginTransaction(); try { for (...) {

Yii框架批量插入数据扩展类的简单实现方法

本文实例讲述了Yii框架批量插入数据扩展类的简单实现方法.分享给大家供大家参考,具体如下: MySQL INSERT语句允许插入多行数据,如下所示: INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 那么要实现批量插入,主要的任务就是按照列顺序,把数据组装成上述格式即可,可以使用sprintf和vsprintf函数来实现. 下面是一个实现批量插入的Yii扩展类的简单示例(支持VARCHAR类型数据): <?php /** *