То, что вы пытаетесь, невозможно. Вам необходимо удалить MovieGenre из сопоставления.
Не беспокойтесь о получении объекта из базы данных, просто чтобы добавить его в список жанров. Если вы загружаете сущность по идентификатору несколько раз, в любом случае происходит только один вызов БД. По мере улучшения EF и добавления кеша второго уровня он будет работать и работать хорошо. Если вы слишком императивны, у вас не останется магии.
И если вы думаете о домене и пользователях вашей модели, большая часть его читается в любом случае, поэтому не так много обновлений. Кроме того, добавление фильма в жанры или наоборот может означать много вещей, и в этом случае вам не следует напрямую выставлять коллекции, а добавлять методы для реализации поведения.
Одним из примеров поведения может быть «если вы добавите фильм в более чем 10 жанров, то фильм должен изменить, скажем, свою категорию на X», и всякие другие вещи. Хватит думать только о данных. Domain Driven Design - хорошая книга для чтения на эту тему.
В данном случае вы можете рассматривать сущность Movie как корневую совокупность, потому что Movie - это то, что нужно вашим пользователям, а Movie - это то, что вы собираетесь редактировать как администратор. Фильм может существовать без жанра, может быть, поэтому жанр - это просто тег на фильмах, объект ценности, и не очень важный. Ваши отображения станут:
public class Genre
{
public int GenreID { get; set;}
public string Name { get; set; }
}
public class Movie
{
public int MovieID { get; set; }
public string Title { get; set; }
public ICollection<Genre> Genres { get; set; }
}
....
//Movie
var movieCfg = modelBuilder.Entity<Movie>();
movieCfg.ToTable("Movie", "Media");
movieCfg.HasMany(m => m.Genres)
.WithMany()
.Map(m =>
{
m.MapLeftKey("MovieID");
m.MapRightKey("GenreID");
m.ToTable("MovieGenre", "Media");
});
Запросы будут выглядеть так:
// get all movies for a particular genre
var movies = movieContext.Movies.Where(m => m.Genres.Any(g => g.GenreID = id))
.OrderBy(m => m.Name)
.ToList();
// get all movies
var movies = movieContext.Movies.OrderBy(m => m.Name).Take(10).ToList();
Это почти все, что вы собираетесь делать со своим доменом.