Здесь происходит несколько вещей.
1 Если вы настроены на отложенную загрузку, дочерние объекты загружаются, только если вы указываете их на загрузку. Это можно сделать с помощью следующего в вашем запросе.
..
context.Contacts.Include(c => c.ContactInfos).Include(c => c.ContactInfos.ContactInfoType)
см. в этой статье для получения полной информации о том, что объекты загружаются так, как вы хотите.
2 Если вы не хотите сохранять contactinfo и contactinfotype (потому что они не загружены или вы просто не хотите), вам нужно будет указать контексту не сохранять дочерние объекты, которые не должен обновляться Это можно сделать с помощью:
..
context.StateManager.ChangeObjectState(entity.ContactInfos.ContactInfoType, EntityState.Unchanged);
Я считаю, что мне нужно это сделать при изменении / использовании объекта страны для пользовательских данных. Я определенно никогда не хочу, чтобы это обновлялось пользователем.
В середине написания небольшого руководства ко всему этому, но могут пройти недели, пока это не будет сделано в моем блоге
3 MVC не будет хранить / отправлять обратно то, что вы не указали в форме. Если вы отправите объектную иерархию в форму, а значения не будут представлены в скрытых входах, они вернутся пустыми в вашей модели. По этой причине я обычно делаю модели представления, которые являются редактируемыми только версиями сущностей с ToEntity и методом ToModel на них. Это также покрывает меня в целях безопасности, так как я не хочу, чтобы все виды пользовательских идентификаторов были скрытыми, просто так мои сущности отображаются прямо в MVC (см. эту статью о превышении ).
Я бы подумал, что тот факт, что ваши свойства contactinfo установлены на виртуальные, UpdateModel не будет возражать, если бы они не существовали при возврате, но я вполне могу ошибаться, поскольку не пробовал.