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

时间:2013-05-12 09:31:04

标签: c# entity-framework

我有这段代码,但我得到了异常

  

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

在else部分。

 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();
      }
 }

1 个答案:

答案 0 :(得分:5)

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

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

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