Entity Framework Core: incluya objetos relacionados de muchos a muchos en WebAPI

No estoy muy familiarizado con .NET Framework, pero decidí probar ASP.NET Core y EF Core. Quiero hacer un back-end de API web bastante simple, pero tengo problemas para trabajar con relaciones de muchos a muchos.

Entiendo que necesito hacer una tabla de relaciones para las dos entidades, como en el ejemplo de esta publicación:¿Cómo crear una relación de muchos a muchos con las últimas versiones nocturnas de EF Core?

También tengo a mi creador de modelos creando la relación como se describe aquíhttp://ef.readthedocs.io/en/latest/modeling/relationships.html#many-to-many

Mi código se ve así:

en DBContext:

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<MovieActor>().HasKey(x => new { x.MovieId, x.ActorId});

        builder.Entity<MovieActor>()
            .HasOne(m => m.Movie)
            .WithMany(ma => ma.MovieActors)
            .HasForeignKey(m => m.MovieId);

        builder.Entity<MovieActor>()
            .HasOne(m => m.Actor)
            .WithMany(ma => ma.MovieActors)
            .HasForeignKey(a => a.ActorId);

    }

    public DbSet<Movie> Movies { get; set; }

    public DbSet<Actor> Actors { get; set; }


}

Modelos:

namespace Test.Models
{
    public class Movie
    {
        public int MovieId { get; set; }
        public string Title { get; set; }
        public DateTime ReleaseDate { get; set; }
        public string Code { get; set; }
        public string Path { get; set; }

        public ICollection<MovieActor> MovieActors { get; set; }
    }

    public class Actor
    {
        public int ActorId { get; set; }
        public string Name { get; set; }
        public ICollection<MovieActor> MovieActors { get; set; }
    }

    public class MovieActor
    {
        public int MovieId { get; set; }
        public Movie Movie { get; set; }

        public int ActorId { get; set; }
        public Actor Actor { get; set; }
    }
}

Esto parece estar funcionando en su mayor parte. Puedo crear nuevos objetos MovieActor y agregarlos a la base de datos. Una cosa que parece extraña es que los modelos Movie y Actor ahora tienen una propiedad MovieActors pero siempre es nula, a pesar de que la tabla de unión tiene entradas.

Lo que no puedo entender es cómo recuperar estos objetos relacionados en mis controladores WebAPI. Mis habilidades con Linq son muy débiles, así que tal vez solo necesito repasar eso, pero no sé por dónde empezar. Cuando obtengo una película por ID u obtengo una lista de todas las películas, me gustaría que el resultado tenga actores relacionados en una matriz en el objeto. Lo mismo va en la otra dirección, cuando obtengo un actor quiero obtener una variedad de sus películas.

Este es uno de mis métodos de controlador que intenta hacer uso de esta relación:

        // POST: api/Movie
    [HttpPost]
    public IActionResult PostMovie([FromBody] MovieBundle Moviebundle)
    {


        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var _movie = _context.Movies.FirstOrDefault(m => m.Code == Moviebundle.Movie.Code);
        if(_movie == null)
        {
            //Doesn't exist! add a new one
            _movie = Moviebundle.Movie;
            _context.Movies.Add(_movie);
            _context.SaveChanges();

            foreach (Actor actor in Moviebundle.actors)
            {
                //Try to look up by name
                Actor _actor = _context.Actors.FirstOrDefault(a => a.Name == actor.Name);

                //If they don't exist, add them to the DB 
                if (_actor == null)
                {
                    _context.Actors.Add(actor);
                    _context.SaveChanges();
                    _actor = actor;
                }

                //This is what I'm using to create the M-t-M relationship
                var link = new MovieActor { Actor = _actor, Movie = _movie };
                _context.MovieActor.Add(link); //This line gives an error


            }


        } else
        {
            return new StatusCodeResult(StatusCodes.Status409Conflict);
        }




        try
        {
            _context.SaveChanges();
        }
        catch (DbUpdateException)
        {
            if (MovieExists(_movie.MovieID))
            {
                return new StatusCodeResult(StatusCodes.Status409Conflict);
            }
            else
            {
                throw;
            }
        }

        return CreatedAtAction("GetMovie", new { id = _movie.MovieID }, _movie);
    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta