Что ж, «время от времени» не похоже на ситуацию, которая заставляет задуматься об улучшении производительности (если вы не имеете в виду «от миллисекунды до миллисекунды»):)
В любом случае, первый подход - правильная идея сделать это обновление без хранимой процедуры. И да, вы должны загрузить все старые связанные объекты, потому что обновление отношения «многие ко многим» происходит только при обнаружении изменений EF. Нет открытого внешнего ключа, который вы могли бы использовать для обновления отношений без загрузки свойств навигации.
Пример того, как это может выглядеть подробно, приведен здесь (свежий вопрос от вчерашнего дня):
Выбор и обновление «Многие ко многим» в Entity Framework 4
(Только последний фрагмент кода перед разделом «Редактировать» относится к вашему вопросу и к самому разделу Редактирования.)
Для вашего второго решения вы можете заключить всю операцию в созданную вручную транзакцию:
using (var scope = new TransactionScope())
{
using (var context = new MyContext())
{
// ... Call Stored Procedure to delete relationships in link table
// ... Insert fake objects for new relationships
context.SaveChanges();
}
scope.Complete();
}