Я работаю над базой данных с фильмами и жанрами (многие ко многим).Я создал 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.Кто-нибудь может дать мне пример и объяснение?
Большое спасибо!