Olá,
Ao realizar o Create Cinema, a propriedade Endereço pode ser carregada?
Entendo que a classe ReadCinemaDto (No meu caso é ExibeCinemaDto) é quem possui a capacidade de ter a propriedade endereço carregada mas mesmo forçando o Parse no Create do Cinema, a propriedade fica null, mas no retornaPor Id carrega normalmente.
Dúvidas:
- Qual a visão de vocês sobre o cenário?
- Qual o motivo da L.Property ser utilizada no RetornaPorId mas não No Insere Cinema se a instrução é a mesma (_context.Cinemas.FirstOrDefault(p => p.Id == cinema.Id) ?
- Por que os tipos são diferentes (Castle.Proxies.Proxy x AluraFilmes.Models.Cinema)?
Abaixo mostro que a propriedade Endereço está null quando insiro o cinema e possui valores se busco o cinema posteriormente.
Acima eu realizei o saveChanges do contexto. Minhas classes estão assim:
[HttpPost]
public IActionResult InsereCinema([FromBody] CreateCinemaDto cinemaDto)
{
var cinema = _mapper.Map<Cinema>(cinemaDto);
_context.Cinemas.Add(cinema);
_context.SaveChanges();
var cinemaFind = _context.Cinemas.FirstOrDefault(p => p.Id == cinema.Id);
var cinemaRetorno = _mapper.Map<ExibeCinemaDto>(cinemaFind);
return CreatedAtAction(nameof(RecuperaCinemaPorId), new { Id = cinema.Id }, cinemaRetorno);
}
[HttpGet("{id}")]
public IActionResult RecuperaCinemaPorId(int id)
{
var cinema = _context.Cinemas.FirstOrDefault(p => p.Id == id);
if (cinema == null) return NotFound();
var cinemaDto = _mapper.Map<ExibeCinemaDto>(cinema);
return Ok(cinemaDto);
}
public class ExibeCinemaDto
{
public int Id { get; set; }
public string Nome { get; set; }
public ExibeEnderecoDto Endereco { get; set; }
}
public CinemaProfile()
{
//De Cinema para ExibeCinemaDto porque controlamos o que será exibido
CreateMap<CreateCinemaDto, Cinema>();
CreateMap<UpdateCinemaDto, Cinema>();
CreateMap<Cinema, ExibeCinemaDto>()
.ForMember(cinemaDto => cinemaDto.Endereco,
opt => opt.MapFrom(cinema => cinema.Endereco));
}
public class Cinema
{
[Key]
[Required]
public int Id { get; set; }
[Required(ErrorMessage = "O nome do cinema é obrigatório")]
[StringLength(50, ErrorMessage = "Não pode ter tamanho maior que 50", MinimumLength = 5)]
public string Nome { get; set; }
public int EnderecoId { get; set; }
public virtual Endereco Endereco{ get; set; }
}