2013-05-12 36 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)來檢查具有相同密鑰的實體實例是否已被跟蹤。

相關問題