gpt4 book ai didi

c# - 添加第二个数据时 ObjectStateManager 错误( Entity Framework )

转载 作者:行者123 更新时间:2023-11-30 17:58:56 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

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

在我的例子中,我必须通过调用来解决这个问题:

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

所以实体先被删除,上下文才被告知。然后我用 SQL 查询截断了表以重置自动递增计数器。

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

希望对您有所帮助。

关于c# - 添加第二个数据时 ObjectStateManager 错误( Entity Framework ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com