实体框架6.1 - 已成功提交对数据库的更改,但更新对象上下文时发生错误

时间:2018-03-01 04:40:52

标签: entity-framework-6

我在调用DbContext.SaveChanges()时遇到错误。

已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。

以下代码在调用DbContext.SaveChanges()时出错,即for循环。

if (ID == null || ID == 0)
        {

            Models.Employee obj = new Models.Employee();
            obj.NAME = Name;
            obj.ID = GetNextSequenceValue();
            var savedObj = DbContext.Employees.Add(obj);
            DbContext.SaveChanges(); // this SaveChanges executes successfully.
            savedId = savedObj.ID;
        }

        for (int i = 0; i < Parameters.Length; i++)
        {
            Models.EmployeeDetail obj = new Models.EmployeeDetail;
            obj.ID = Convert.ToInt32(savedId);
            obj.KEY = Parameters[i].Key;
            obj.VALUE = Parameters[i].Value;
            DbContext.EmployeeDetails.Add(obj);
        }
**// error code**
 DbContext.SaveChanges();

但是,当我将代码更改为以下(请参阅for循环代码)时,它可以正常工作。但作为性能考虑因素,我在每次调用for循环时都会遇到DB。

if (ID == null || ID == 0)
                {

                    Models.Employee obj = new Models.Employee();
                    obj.NAME = Name;
                    obj.ID = GetNextSequenceValue();
                    var savedObj = DbContext.Employees.Add(obj);
                    DbContext.SaveChanges();
                    savedId = savedObj.ID;
                }

                for (int i = 0; i < Parameters.Length; i++)
                {
                    Models.EmployeeDetail obj = new Models.EmployeeDetail;
                    obj.ID = Convert.ToInt32(savedId);
                    obj.KEY = Parameters[i].Key;
                    obj.VALUE = Parameters[i].Value;
                    DbContext.EmployeeDetails.Add(obj);
                    DbContext.SaveChanges();
                    DbContext.EmployeeDetails.Remove(obj);
                }

请建议我如何才能正常使用。

2 个答案:

答案 0 :(得分:0)

在查看模型结构与DB的映射后,发布了模型的错误结构。问题是模型没有密钥(主要)定义。关联正确的密钥序列后,问题就解决了。

希望这可以帮助那些正在研究类似问题的人。

答案 1 :(得分:0)

分离实体的当前状态并更改下一个状态调用。在Savechanges()之后添加分离的代码行:

db.Entry(your entity).State = EntityState.Added;
db.SaveChanges();
db.Entry(your entity).State = EntityState.Detached;