Если я правильно понимаю вашу проблему, коллекция genres
содержит все объекты Genre
, которые должны быть в списке жанров Band
в результате выполнения метода UpdateBandGenres
(а не только список для добавленияили список для удаления).В этом случае самым простым будет удаление всех жанров из коллекции и добавление всех жанров с Guid
s из вашей коллекции genres
.
Прежде всего, вам не нужны объединения для захватаваш newGenres
:
var newGenres = ctx.Genres.Where(g => genres.Contains(g.GenreId));
Во-вторых, вам нужно получить объект Band
, так как изменение его коллекции Genres
скажет EF изменить таблицу BandGenres
в SQL:
Band band = ctx.Bands.SingleOrDefault(b => b.BandId == bandId);
После этого вы можете очистить коллекцию band.Genres
и добавить newGenres
сверху.В результате ваш код будет выглядеть следующим образом:
public void UpdateBandGenres(Guid bandId, IEnumerable<Guid> newGenreIds)
{
using (var ctx = new OpenGroovesEntities())
{
List<Genre> newGenres = ctx.
Genres.
Where(g => newGenreIds.Contains(g.GenreId)).
ToList();
Band band = ctx.Bands.Single(b => b.BandId == bandId);
band.Genres.Clear();
newGenres.ForEach(band.Genres.Add);
ctx.SaveChanges();
}
}
Кстати, я бы также рекомендовал быть согласованным с именами ваших переменных - например, IEnumerable<Guid> genres
может быть немного вводящим в заблуждение, так как на самом деле это набор Guid
s, а не коллекция Genre
объектов.Поэтому я назвал его newGenreIds
, чтобы он соответствовал вашему Guid bandId
имени переменной.