Использование списков с отношением «многие ко многим» в Entity Framework Core - PullRequest
0 голосов
/ 10 октября 2018

Итак, я разрабатываю базовый проект, который использует Entity Framework Core для создания базы данных, которая получает информацию из TMDB на основе любого фильма, в который я вхожу, чтобы попытаться лучше понять все это.

Я былзастрял на некоторое время, пытаясь реализовать отношения «многие ко многим» между моими моделями Movie и Studio.

К фильмам может быть приписано много студий, но есть также много фильмов, которые будут подключены к студиям, так что это четкое отношение к использованию.Ниже приведены фрагменты этих моделей:

public class Movies
{
    [Key]
    public int MovieID { get; set; }
    public ICollection<MovieStudios> MovieStudios { get; set; } = new List<MovieStudios>();
}
public class Studios
{
    [Key]
    public int StudioID { get; set; }
    public ICollection<MovieStudios> MovieStudios { get; set; } = new List<MovieStudios>();
}

А вот таблица соединений, которую я получил

public class MovieStudios
{
    public int MovieID { get; set; }
    public Movies Movie { get; set; }
    public int StudioID { get; set; }
    public Studios Studio { get; set; }
}

А вот мой класс DbContext: открытый класс MyDbContext: DbContext {publicDbSet TblMovies {get;задавать;} public DbSet TblStudios {get;задавать;}

    protected override void OnConfiguring(DbContextOptionsBuilder option)
    {
        option.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB; Database=ServerDatabase ; Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MovieStudios>()
            .HasKey(bc => new { bc.MovieID, bc.StudioID });
    }
}

В одном из моих сервисов я хочу получить список возврата, чтобы я мог связать эти студии с фильмом, о котором идет речь, когда фильм добавлен в базу данных, но япросто полностью потерян, что делать.Извините, если это нубский вопрос, или если он слишком длинный, просто почувствуйте себя полностью потерянным!

РЕДАКТИРОВАТЬ: Если быть более точным, я передаю идентификатор TMDB фильма в службу, которую я создал, чтовозвращает список идентификаторов киностудий, например ('46226', '6735'), который затем сохраняется в моей базе данных, а также возвращает индексный номер моей базы данных Studio, чтобы его можно было добавить в мой фильм.(«1», «4», «6»).Я сохранил это в виде списка и застрял в том, как я могу добавить эти студийные идентификаторы в фильм, который я пытаюсь добавить в базу данных.Все примеры, которые я видел, на самом деле не касаются того, что я пытаюсь сделать.Я пытаюсь добавить много студий к одному фильму.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Если вы хотите добавить много студий к одному фильму, вы можете попробовать использовать для зацикливания.

Попробуйте использовать код, показанный ниже в вашем действии

public async Task<IActionResult> AddStudiosToMovie(int  movieID, List<int> studioIdList)
    {
       for(int i=0;i<studioIdList.Count();i++)
        {
            var movieToStudio = new MovieStudios
            {
                MovieID = movieID,
                StudioID = studioIdList[i]
            };
            _context.Add(movieToStudio);
            await _context.SaveChangesAsync();
        }

        return RedirectToAction(nameof(Index));

    }
0 голосов
/ 10 октября 2018

Правильный способ сделать это так:

// define composite key for MovieStudios
modelBuilder
    .Entity<MovieStudios>()
    .HasKey(ct => new {ct.MovieId, ct.StudioId});

// setup one-to-many relationship MovieStudios-Movies
modelBuilder.Entity<MovieStudios>()
    .HasOne(movieStudio => movieStudio.Movie)
    .WithMany(movie => movie.MovieStudios)
    .HasForeignKey(movieStudio => movieStudio.MovieId);

// setup one-to-many relationship MovieStudios-Studios
modelBuilder.Entity<MovieStudios>()
    .HasOne(movieStudio => movieStudio.Studio)
    .WithMany(studio => studio.MovieStudios)
    .HasForeignKey(movieStudio => movieStudio.StudioId);

A many-to-many отношение между Movies и Studios эквивалентно двум one-to-many отношениям между MovieStudios (таблица отношений) и Movies и Studios соответственно.

Редактировать:

Вы можете добавлять фильмы в студию следующим образом:

public async Task AddMoviesToStudioAsync(List<Movie> movies, int studioId) 
{
    var movieStudiosList
        = movies.Select(
            movie => new MovieStudios
            {
                MovieId = movie.Id, 
                StudioId = studioId
            })
            .ToList();

    await DbContext.Set<MovieStudios>().AddRangeAsync(movieStudiosList);
}
...