2013-05-12 50 views
1

我有这样的代码,但我得到异常{“具有相同键的对象已经存在于ObjectStateManager该ObjectStateManager不能用相同的密钥跟踪多个目标。”}

一个对象,具有相同键已经存在于ObjectStateManager中。 ObjectStateManager无法使用相同的 键追踪多个对象。

in the else part。

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

您的'entity.Id'设置为身份和自动增量? – gideon 2013-05-12 09:33:05

回答

5

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

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

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

相关问题