【问题标题】:ObjectStateManager error while adding second data (Entity Framework)添加第二个数据时出现 ObjectStateManager 错误(实体框架)
【发布时间】:2012-07-25 03:20:21
【问题描述】:

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

【问题讨论】:

  • 发生这种情况的方法是什么(例如,Add(T entity)Attach(T entity))?你能发布堆栈跟踪吗?

标签: c# entity-framework savechanges objectstatemanager


【解决方案1】:

遇到了这个问题,发现自己在做如下操作,导致EntityFramework变得与数据库中的数据不同步:

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

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

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

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

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

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

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

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这样? Context.ObjectStateManager.GetObjectStateEntry(entity).AcceptChanges();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2016-12-16
    相关资源
    最近更新 更多