обновление объекта отношения объекта - PullRequest
0 голосов
/ 18 мая 2011

Подскажите пожалуйста, где я не прав. У меня был следующий код:

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

1 Ответ

0 голосов
/ 18 мая 2011

Предполагая, что ваш класс 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();
}

Просто предположение, я не уверен, решит ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...