2011-05-18 83 views
0

請你能告訴我我錯在哪裏。我有下面的代碼:實體關係對象更新

public void UpdateClient(Client oClient) 
    {           
     foreach(Mitarbeiter item in oClient.Mitarbeiters) 
     { 
      if (item.MiID==0) 
      {      
       context.Mitarbeiters.AddObject(item);      
      } 
      else { 
       var key = context.CreateEntityKey("Mitarbeiters",item); 
       object original; 
       if (context.TryGetObjectByKey(key,out original)) 
       { 
        context.ApplyCurrentValues(key.EntitySetName,item); 
       } 
      } 
     } 
     context.Clients.First(c => c.ClID == oClient.ClID);    
     context.Clients.ApplyCurrentValues(oClient); 


     context.SaveChanges(); 

} 我收到

與已經在ObjectStateManager存在相同的密鑰的對象。 ObjectStateManager不能使用同一個鍵跟蹤多個對象。

當我添加一個新的對象來Mitarbeiters

回答

0

假設你Mitarbeiter類有一個導航屬性Client,當你通過循環(所以item.Client != null)運行它不爲空,然後通過加入item到ObjectSet還可將引用的Client添加到狀態爲Added的上下文中。 (添加實體不僅會添加實體本身,還會添加所有尚未在上下文中引用的實體。)稍後(context.Clients.First(c => c.ClID == oClient.ClID);)您第二次加載客戶端,這已經在Added狀態的上下文中,這是導致例外。

嘗試在客戶端加載到上下文添加item前:

public void UpdateClient(Client oClient) 
{           
    context.Clients.First(c => c.ClID == oClient.ClID); 

    foreach(Mitarbeiter item in oClient.Mitarbeiters) 
    { 
     if (item.MiID==0) 
     {      
      context.Mitarbeiters.AddObject(item);      
     } 
     else { 
      var key = context.CreateEntityKey("Mitarbeiters",item); 
      object original; 
      if (context.TryGetObjectByKey(key,out original)) 
      { 
       context.ApplyCurrentValues(key.EntitySetName,item); 
      } 
     } 
    } 
    context.Clients.ApplyCurrentValues(oClient); 

    context.SaveChanges(); 
} 

只是一個猜測,我不知道這是否會解決您的問題。

+0

感謝Slauma,你是對的。我只需要在調用AddObject之前設置item.Client = null。 – Tiho 2011-05-26 11:56:08