使用Oracle ODP.NET在.NET Entity框架中调用SaveChanges时出现InvalidOperationException

时间:2015-08-18 09:17:08

标签: c# oracle entity-framework odp.net

我有一个代码可以从数据库中删除某些实体,然后重新插入更新的行。方案如下:

 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一起使用。更新的表使用复合主键。

1 个答案:

答案 0 :(得分:0)

简而言之 - 它是数据中复制的复合主键值。

通常,错误表示在对象上下文中或上下文与数据库之间出现某种不一致。它通常是由同时修改某些数据(通过EF之外的其他数据)引起的,例如通过存储过程,因此上下文变得过时。

然而,在这种情况下,问题出在其他地方。即在复合键中。在数据中很容易忽略它,但是如果我们有主键,它由三个,四个,五个值组成,并且在要更新的行列表中某处,则密钥是重复的,实体框架将抛出​​该异常。