Если бы у меня была, например, таблица сопоставления «многие ко многим» под названием «RolesToUsers» между таблицей «Пользователи» и «Роли», вот как я это делаю:
// DataContext is db, usr is a User entity
// newUserRolesMappings is a collection with the desired new mappings, probably
// derived by looking at selections in a checkbox list of Roles on a User Edit page
db.RolesToUsers.DeleteAllOnSubmit(usr.RolesToUsers);
usr.RolesToUsers.Clear();
usr.RolesToUsers.AddRange(newUserRolesMappings);
Я использовал профилировщик SQL один раз, и это, кажется, генерирует очень интеллектуальный SQL - он будет отбрасывать только те строки, которые больше не находятся в отношении отображения, и только добавлять строки, которых еще не было в этом отношении. Это не делает вслепую полную очистку и восстановление отношений, как я и думал.
В Интернете на эту тему удивительно тихо, и запрос «LinqToSQL« многие ко многим »» в основном просто приводит статьи о том, что преобразователь данных LinqToSQL не «хорошо» его поддерживает.
Как все остальные обновляют многие ко многим с помощью LinqToSQL?