{"ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象."}

tal*_*tal 1 c# entity-framework

我有这个代码,但我得到了例外

ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象.

在其他部分.

 public int AddOrUpdateEntity<T>(T entity) where T : class , IEntity
 {
     int numberOfobjectsWritten = 0;

     using (DalContext dbContext = new DalContext())
     {
       //If Id == 0 it means it's a new entity in Db and needs to be added
         dbContext.Entry<T>(entity).State = entity.Id == 0 ?
                                   EntityState.Added :
                                  EntityState.Modified;

         numberOfobjectsWritten = dbContext.SaveChanges();
      }
 }
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 5

此异常意味着存在具有上下文已跟踪的相同密钥的重复实体.每个实体只能由上下文跟踪一次.如果您尝试附加同一实体的另一个实例(它具有与已跟踪的实例相同的密钥),您将获得此异常.

这意味着您正在尝试更新的实体的另一个实例已经被上下文跟踪.因为附加或添加总是应用于整个对象图(它也应用于通过导航属性访问的相关实体),所以有问题的实体不一定必须是您尝试修改的实体,而是其任何关系.

您可以尝试使用dbContext.ChangeTracker.Entries<T>().FirstOrDefault(e => e.Id == entity.Id)以检查是否已跟踪具有相同密钥的实体实例.