我在调用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);
}
请建议我如何才能正常使用。
答案 0 :(得分:0)
在查看模型结构与DB的映射后,发布了模型的错误结构。问题是模型没有密钥(主要)定义。关联正确的密钥序列后,问题就解决了。
希望这可以帮助那些正在研究类似问题的人。
答案 1 :(得分:0)
分离实体的当前状态并更改下一个状态调用。在Savechanges()
之后添加分离的代码行:
db.Entry(your entity).State = EntityState.Added;
db.SaveChanges();
db.Entry(your entity).State = EntityState.Detached;