2010-09-15 4 views
3

В настоящее время я обновляемое скалярных свойствах объекта-кандидата, как так:Update нескалярные объекты в Entity Framework v4

public Candidate EditCandidate(Candidate candidateToEdit) 
    { 
      _entities.Candidates.Attach(new Candidate { ID = candidateToEdit.ID }); 
      _entities.Candidates.ApplyCurrentValues(candidateToEdit); 

      //update candidate.contact here somehow 

      _entities.SaveChanges(); 

      return candidateToEdit; 
    } 

Это только обновляет кандидатских скаляры, так это то, что делает ApplyCurrentValues. Мне также необходимо обновить объект candid.contact, в настоящее время кажется единственной возможностью получить текущий кандидат в базе данных с помощью идентификатора кандидатаToEdit, получить идентификатор контакта и обновить его таким образом, но я не уверен что «лучший» способ сделать это. У кандидатаToEdit.contact есть значения, но не ID, поскольку он не привязан к моему представлению. Переключиться на контактный контекст и сделать это точно так же, как я обновил кандидата?

Update: Решение

Основываясь на Dan's answer ниже.

_entities.Candidates.Attach(candidateToEdit); 
_entities.ObjectStateManager.ChangeObjectState(candidateToEdit, EntityState.Modified); 
_entities.ObjectStateManager.ChangeObjectState(candidateToEdit.contact, EntityState.Modified); 
_entities.SaveChanges(); 
+0

Вы используете Entities саморегулирующихся? –

ответ

4

Поскольку у кандидатаToEdit есть контактная информация, я думаю, вы можете сделать это вот так. Это предполагает, что ваши _entities являются объектным контекстом для EF.

public void Update(Candidate candidateToEdit) 
{ 
    _entities.Candidates.Attach(candidateToEdit); 
    _entities.ObjectStateManager.ChangeObjectState(candidateToEdit, EntityState.Modified); 
    _entities.SaveChanges(); 
} 

Я думаю, что сохраняет все навигационные свойства ...

+0

Спасибо за вашу помощь, что сделал трюк, я добавил свой код, основываясь на том, что вы показали мне здесь, в моем оригинальном посте. Думаю, вторая строка должна быть _entities.ObjectStateManager. –

+0

Вы правы, вторая строка должна быть _entities.ObjectStateManager.ChangeObjectState (candidToEdit, EntityState.Modified); Рад, что это сработало для вас! –