我有一个代码可以从数据库中删除某些实体,然后重新插入更新的行。方案如下:
db.BeginTransaction();
try
{
//Delete some rows
db.SaveChanges();
//Add updated rows
db.SaveChanges();
db.Commit()
}
catch
{
db.Rollback();
throw;
}
在某些情况下,但一般情况下我没有在第二次SaveChanges之后出现以下错误:
数据库的更改已成功提交,但出现错误 更新对象上下文时发生。 ObjectContext可能是 处于不一致的状态。内部异常消息:AcceptChanges 无法继续,因为对象的键值与另一个键冲突 ObjectStateManager中的对象。确保键值是 在调用AcceptChanges之前是唯一的。
数据库是Oracle,我使用ODP.NET Oracle提供程序使其与Entity Framework一起使用。更新的表使用复合主键。
答案 0 :(得分:0)
简而言之 - 它是数据中复制的复合主键值。
通常,错误表示在对象上下文中或上下文与数据库之间出现某种不一致。它通常是由同时修改某些数据(通过EF之外的其他数据)引起的,例如通过存储过程,因此上下文变得过时。
然而,在这种情况下,问题出在其他地方。即在复合键中。在数据中很容易忽略它,但是如果我们有主键,它由三个,四个,五个值组成,并且在要更新的行列表中某处,则密钥是重复的,实体框架将抛出该异常。