添加第二个数据时出现ObjectStateManager错误(实体框架)

时间:2012-07-26 14:01:31

标签: c# entity-framework savechanges objectstatemanager

当我添加多个连续数据时,SaveChanges()方法发生错误。

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

我的基础服务

public void Delete(T entity)
    {
        ObjectSet.DeleteObject(entity);
        Context.SaveChanges();
    }

    public void Add(T entity)
    {
        ObjectSet.AddObject(entity);
        Context.SaveChanges();

    }

    public void Attach(T entity)
    {
        ObjectSet.Attach(entity);
        Context.SaveChanges();
    }

    public void Update(Expression<Func<T, bool>> where, T entity)
    {
        var ent = First(where);
        ent = entity;
        Context.SaveChanges();
    }

2 个答案:

答案 0 :(得分:1)

我遇到了这个问题,发现我正在执行以下操作,使EntityFramework与数据库中的数据不同步:

1)通过Entity Framework的Context对表的行进行查询。这样做,EntityFramework上下文在其Local视图中保留了这些对象的副本。

2)通过SQL查询截断表(因此实体框架上下文不知道发生了这种情况。实体仍在其本地视图中,即使它们在数据库中被截断)。 由于表的主键是自动递增(IDENTITY(1,1)),因此截断调用使表的主键计数器重置为1.

3)通过Entity Framework向表中添加行,然后调用SaveChanges()。由于表截断,新行的主键为1.创建行后,EntityFramework为数据库查询行值,创建新实体,填充实体中的值并将实体添加到其本地视图

因为上下文已经在其本地视图中存储了另一个主键= 1的对象(从步骤1开始),所以在尝试将具有相同主键的第二个实体添加到本地视图时会抛出异常。

为了避免这种情况,在进行新操作之前,Entity Framework必须与数据库内容保持同步。

在我的情况下,我不得不通过调用来解决这个问题:

Context.MyTableEntities.Local.Clear();
Context.SaveChanges();

因此首先删除了实体,并告知了上下文。然后我用SQL查询截断了表来重置自动增量计数器。

由于首先从本地视图中删除了对象,并且之后执行了表截断(因此它重置了自动增量计数器),因此避免了主键冲突。

希望有所帮助。

答案 1 :(得分:0)

您确定要将不同的实体添加到EF吗?内部异常表明AcceptChanges()失败,因为您尝试添加的当前实体与已经被跟踪的实体共享密钥。

有关AcceptChanges()的更多信息,请查看:http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.acceptchanges.aspx