2011-05-18 90 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