首页 > 解决方案 > 具有多对多关系和 Automapper 的 HttpPost

问题描述

我正在研究一个包含电影和流派(多对多)的数据库。我已经创建了一个 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();
        }
    }

如果我使用 Postman 检查功能,我可以从数据库中获取数据,但如果我尝试发布某些内容,则会出现错误。原因是流派,但我不知道我的映射是否错误,或者我是否需要某种与我的 viewModel 的连接来组合电影和流派。我尝试了很多东西,但我真的不明白如何使用 API、多对多、Dtos、viewModel 和 Automapper。有人可以给我一个例子和解释吗?

非常感谢!

标签: c#asp.net-mvcmany-to-manyviewmodeldto

解决方案


推荐阅读