3

当我添加多个连续数据时,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();
    }
4

2 回答 2

1

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

1)通过实体框架的上下文对表的行进行查询。这样做,EntityFramework 上下文会在其本地视图中保留这些对象的副本。

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

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

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

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

就我而言,我必须通过调用来解决这个问题:

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

所以先删除 Entity,然后将上下文告诉它。然后我用 SQL 查询截断了表以重置自动增量计数器。

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

希望有帮助。

于 2014-11-05T16:55:55.873 回答
0

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

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

于 2012-07-26T14:21:23.847 回答