【发布时间】:2018-03-01 04:40:51
【问题描述】:
我在调用 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-loop 时都会访问 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);
}
请建议我怎样才能使它正常工作。
【问题讨论】: