В EF 3.5 SP1 вы не можете изменить ссылку (то есть subscriber.Addon), не зная исходного значения. Обратите внимание, что это ограничение исчезнет в EF 4, если вы используете FK Ассоциации .
Теперь в большинстве случаев EF скрывает эту дополнительную сложность от вас, но не тогда, когда вы используете Attach, как это.
Вот код, который вам нужен:
AddOn newAddOn = new AddOn { AddOnID = 5};
AddOn oldAddOn = new AddOn { AddOnID = 4}; // you need to remember the old id.
Subscriber subscriber = new Subscriber { SubscriberID = 1, AddOn = oldAddOn};
using (var context = new TestEntities())
{
context.AttachTo("AddOn", newAddOn);
context.AttachTo("Subscriber", subscriber); // will attach the oldAddOn too
subscriber.Name = "dummy";
subscriber.AddOn = newAddOn;
context.SaveChanges();
}
Как видите, мы просто рассказываем EF об исходных отношениях, а затем меняем их, как и раньше.
Это должно решить твою проблему.
Как вы обнаружили, вызов refresh также работает ... потому что он берет для вас исходное значение для ссылки из базы данных. Недостатком использования Refresh является то, что он отправляет запрос обратно в базу данных.
Таким образом, добавление исходного значения, как указано выше, просто сохраняет этот дополнительный запрос.
Надеюсь, это поможет
1020 * для -Alex- *
Руководитель программы Entity Framework Team.
См. Совет 26 из моей серии EF Tips для получения дополнительной информации.