c# - 具有多对多关系和 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。有人可以给我一个例子和解释吗?
非常感谢!
解决方案
推荐阅读
- javascript - 如何将文本字段输入从前端发送到后端
- c++ - 尝试使用 OpenGL 创建粒子系统时出现分段错误
- pine-script - 多个条件之间的最后一个
- python - Selenium Python:通过创建的循环获取正确属性和查找产品的问题
- javascript - 无法通过拆分数组中的字符串来创建新对象
- r - 从 R 中的参与者那里选择第二个观察结果
- c++ - glm::rotation 不能正常工作 OpenGL C++
- r - 根据条件返回列名,否则返回 NA
- javascript - 丢弃数组中的元素,拼接是答案吗?
- javascript - 会话过期问题有解决办法吗?