Entity Framework Core: Bezieht viele-zu-viele verwandte Objekte in WebAPI ein

Ich bin mit dem .NET-Framework nicht allzu vertraut, habe mich aber entschlossen, ASP.NET Core und EF Core auszuprobieren. Ich möchte ein ziemlich einfaches Web-API-Backend erstellen, habe aber Probleme mit der Arbeit mit vielen-zu-vielen-Beziehungen.

Ich verstehe, dass ich eine Beziehungstabelle für die beiden Entitäten erstellen muss, wie im Beispiel aus diesem Beitrag:Wie kann man eine Beziehung zwischen vielen und den neuesten nächtlichen Versionen von EF Core aufbauen?

Ich habe auch meinen Model Builder, der die Beziehung wie hier beschrieben erstellt.http: //ef.readthedocs.io/en/latest/modeling/relationships.html#many-to-man

Mein Code sieht so aus:

in 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; }


}

Models:

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; }
    }
}

Dies scheint zum größten Teil zu funktionieren. Ich kann neue MovieActor-Objekte erstellen und zur Datenbank hinzufügen. Eine seltsame Sache ist, dass die Movie- und Actor-Modelle jetzt eine MovieActors-Eigenschaft haben, die jedoch immer null ist, obwohl die Join-Tabelle Einträge enthält.

Das, was ich nicht herausfinden kann, ist, wie diese verwandten Objekte in meinen WebAPI-Controllern abgerufen werden. Meine Linq-Kenntnisse sind sehr schwach. Vielleicht muss ich das nur auffrischen, aber ich weiß nicht, wo ich anfangen soll. Wenn ich einen Film nach ID oder eine Liste aller Filme erhalte, möchte ich, dass das Ergebnis alle zugehörigen Akteure in einem Array auf dem Objekt enthält. Das gleiche gilt in die andere Richtung, wenn ich einen Schauspieler bekomme, möchte ich eine Reihe ihrer Filme bekommen.

Hier ist eine meiner Controller-Methoden, die versucht, diese Beziehung zu nutzen:

        // 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);
    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage