HttpPost с отношениями многие ко многим и Automapper - PullRequest
0 голосов
/ 08 октября 2018

Я работаю над базой данных с фильмами и жанрами (многие ко многим).Я создал API и борюсь с DTO и отношениями «многие ко многим».

public class MovieDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OriginalTitel { get; set; }
    public DateTime ReleseDate { get; set; }
    public int Duration { get; set; }
    public string Description { get; set; }
    public int? Rating { get; set; }
    public int? PersonalRating { get; set; }
    public int AgeRestrictionId { get; set; }
    public ICollection<GenreDto> Genres { get; set; }
}

public class GenreDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsChecked { get; set; }
}

С помощью другого поста я создал это отображение

public MappingProfile()
{
    Mapper.CreateMap<Movie, MovieDto>();

    Mapper.CreateMap<Genre, GenreDto>()
        .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id))
        .ForMember(d => d.Name, opt => opt.MapFrom(s => s.Name));

    Mapper.CreateMap<MovieDto, Movie>()
          .AfterMap((s, d) =>
          {
              foreach (var Genre in d.Genres)
                  Genre.Id = s.Id;
          });

    Mapper.CreateMap<GenreDto, Movie>()
          .ForMember(d => d.Id, opt => opt.MapFrom(s => s.Id));
}

И это мой контроллер API

public class MoviesController : ApiController
    {
        private ApplicationDbContext _context;

        public MoviesController()
        {
            _context = new ApplicationDbContext();
        }

        // GET /api/movies
        public IHttpActionResult GetMovies()
        {
            return Ok(_context.Movies.ToList().Select(Mapper.Map<Movie, MovieDto>));
        }

        //GET /api/movies/1
        public IHttpActionResult GetMovie(int id)
        {
            var movie = _context.Movies.SingleOrDefault(m => m.Id == id);

            if (movie == null)
                return NotFound();

            return Ok(Mapper.Map<Movie, MovieDto>(movie));
        }

        //POST /api/movies

        [HttpPost]
        public IHttpActionResult CreateMovie (MovieDto movieDto)
        {
            if (!ModelState.IsValid)
                return BadRequest();

            var movie = Mapper.Map<Movie>(movieDto);
            _context.Movies.Add(movie);
            _context.SaveChanges();

            return Created(new Uri(Request.RequestUri + "/" + movie.Id), movieDto);
        }

        //PUT /api/movies/1
        [HttpPut]
        public void UpdateMovie(int id, MovieDto movieDto)
        {
            if (!ModelState.IsValid)
                throw new HttpResponseException(HttpStatusCode.BadRequest);

            var movieInDb = _context.Movies.SingleOrDefault(m => m.Id == id);

            if (movieInDb == null)
                throw new HttpResponseException(HttpStatusCode.NotFound);

            Mapper.Map(movieDto, movieInDb);

            _context.SaveChanges();
        }

        //DELETE api/movies/1
        [HttpDelete]
        public void DeleteMovie(int id)
        {
            var movieInDb = _context.Movies.SingleOrDefault(m => m.Id == id);

            if (movieInDb == null)
                throw new HttpResponseException(HttpStatusCode.NotFound);

            _context.Movies.Remove(movieInDb);
            _context.SaveChanges();
        }
    }

Если я проверяю функциональностьс почтальоном я могу получить данные из базы данных, но если я пытаюсь что-то опубликовать, я получаю сообщение об ошибке.Причина в жанре, но я не знаю, является ли мое отображение неправильным или мне нужно какое-то соединение с моей viewModel для сочетания фильма и жанра.Я перепробовал много вещей, но я не очень понимаю, как работать с API, многие ко многим, Dtos, viewModel и Automapper.Кто-нибудь может дать мне пример и объяснение?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...