Это хорошо известная проблема обособленных субъектов и независимых ассоциаций. Проблема состоит в том, что установка объекта в модифицированное не устанавливает отношения для модифицированного. Подробное описание всех проблем здесь . Ответ связан с EFv4 и ObjectContext API, но EFv4.1 - всего лишь обертка вокруг него, поэтому смысл тот же.
Источником этой проблемы является то, что если вы используете отдельные сущности, вы должны сказать EF, что отношение изменилось. EF не будет делать никаких предположений для вас. Проблема с DbContext API еще хуже, потому что DbContext API не предлагает методов для изменения состояния независимой ассоциации , поэтому вы должны вернуться к ObjectContext API и использовать ObjectStateManager.ChangeRelationshipState
.
Существуют и другие способы, как справиться с этим, если вы не используете удаленные вызовы в качестве WCF - это просто порядок команд, который вы должны выполнить, чтобы сделать эту работу, но при использовании WCF вы не можете присоединить объект, прежде чем установить отношение и т.д. Хорошо, теоретически вы можете, но это полностью изменит ваш контракт на обслуживание и хореографию обмена сообщениями.
Таким образом, как правило, самое простое решение в этом сценарии - использовать сопоставление внешнего ключа вместо независимого сопоставления . Ассоциация внешнего ключа не отслеживается как отдельный объект с состоянием (как независимая ассоциация), поэтому изменение состояния объекта на измененное будет просто работать.
public class Company
{
public int Id { get; set; }
public string CompanyName { get; set; }
public int HomeCountryId { get; set; }
public Country HomeCountry { get; set; }
}
HasRequired(x => x.HomeCountry)
.WithMany()
.HasForeignKey(x => x.HomeCountryId);
Любое другое решение заключается в том, чтобы сначала загрузить старый объект из БД и объединить изменения в присоединенный объект - это то, что я делаю все время, и вам придется делать это, как только вы начнете работать с отношениями "многие ко многим" или удаление в отношениях один-ко-многим.