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

C# 添加第二个数据时ObjectStateManager错误(实体框架),c#,entity-framework,savechanges,objectstatemanager,C#,Entity Framework,Savechanges,Objectstatemanager,添加多个连续数据时,SaveChanges()方法中出现错误 例外情况 已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。 我的基本服务 public void Delete(T entity) { ObjectSet.DeleteObject(e

添加多个连续数据时,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();
    }
公共作废删除(T实体)
{
ObjectSet.DeleteObject(实体);
SaveChanges();
}
公共无效添加(T实体)
{
ObjectSet.AddObject(实体);
SaveChanges();
}
公共无效附加(T实体)
{
ObjectSet.Attach(实体);
SaveChanges();
}
公共无效更新(表达式,其中,T实体)
{
var ent=第一个(其中);
ent=实体;
SaveChanges();
}

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


有关
AcceptChanges()
的详细信息,请查看:

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

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

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

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

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

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

就我而言,我必须通过打电话来解决这个问题:

Context.MyTableEntities.Local.Clear();
Context.SaveChanges();
因此,首先删除实体,并告知上下文。然后,我用SQL查询截断了表,以重置自动递增计数器

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


希望有帮助

使用哪种方法(例如,
Add(T实体)
Attach(T实体)
)会发生这种情况?你能用这种方式发布堆栈跟踪吗?Context.ObjectStateManager.GetObjectStateEntry(实体).AcceptChanges();