2012-09-11 38 views
0

我在MVC中創建應用程序。當我嘗試向SQL Server 2008插入數據時,它顯示如下錯誤:當插入數據到sqlserver顯示錯誤

ObjectStateManager中已存在具有相同鍵的對象。 現有對象處於未更改狀態。如果一個對象處於添加狀態,則只能將 添加到ObjectStateManager。

這是什麼意思?

 Candidate candidate = _repository.GetCandidate(LoggedInCandidate.Id); 

      candidate.Name = collection["Name"]; 
      candidate.Email = collection["Email"]; 
      candidate.Address = collection["Address"]; 
      candidate.ContactNumber = collection["ContactNumber"]; 
      candidate.MobileNumber = collection["MobileNumber"]; 
      candidate.LicenseNumber = collection["LicenseNumber"]; 
      int candidateId = _repository.AddCandidate(candidate); 
      string[] languages = collection["Languages"].Split(','); 
     foreach (string language in languages) 
     { 
      if (!string.IsNullOrEmpty(language)) 
      { 
       CandidateLanguage cl = new CandidateLanguage(); 
       cl.CandidateId = candidateId; 
       cl.LanguageId = Convert.ToInt32(language); 
       _repository.AddCandidateLanguage(cl); 
      } 
     } 

      _repository.Save(); 
      } 
+2

這意味着,具有相同ID的相同類型的和實體已經被加載到上下文和複製是不允許的。我們需要看到一些代碼能夠分辨出究竟導致了什麼。 –

+1

請向我們展示您的控制器代碼,將其插入數據庫並調用db.SaveChanges() –

回答

0

你已經得到了一個身份證的候選人。你爲什麼再次插入這個候選人的上下文?

如果你想插入一個新的候選人,爲什麼你要創建一個新的候選人並插入它。

+0

我在GetCandidate()的存儲庫中有一個方法。我只是稱這個功能。我插入了CandidateId以從數據庫獲取candidateId並將其他值存儲在相同的Id中。我不知道它爲什麼顯示錯誤。 – Duk

+0

如果你想存儲你獲得的候選人的其他值,你只需要更新這個候選人。 – stevenqb1890

+0

我改正它。感謝您的評論。我將candidateId分配給candidate.id。然後它被添加。 – Duk

0

如果您希望複製現有實體並在此之後修改某些屬性,則需要複製構造函數(或具有類似想法的東西),然後將新實體插入到數據庫中。

如果你想修改當前的候選人,你會做

 Candidate candidate = _repository.GetCandidate(LoggedInCandidate.Id); 

     candidate.Name = collection["Name"]; 
     candidate.Email = collection["Email"]; 
     candidate.Address = collection["Address"]; 
     candidate.ContactNumber = collection["ContactNumber"]; 
     candidate.MobileNumber = collection["MobileNumber"]; 
     candidate.LicenseNumber = collection["LicenseNumber"]; 

     _repository.Entry(candidate).State = EntityState.Modified; 

     .... 

     _repository.Save();