Many-to-Many com EF COre e AutoMapper

09/04/2020

15

Pessoal, tenho a seguinte situação aqui.
Tenho duas entidades, Treinamento e Departamento, sendo que o relacionamento delas é many to many e eu tenho uma terceira classe chamada TreinamentoDepartamento que trata isso.
Usei AutoMapper para realizar o mappeamento das entidades para DTOs que criei delas.
Quando realizo um POST com um JSON como esse:

{
    "titulo": "teste",
    "urlVideo": "teste",
    "urlArquivo": "teste",
    "departamentos": [
      {
        "nome": "TI",
        "treinamentos": []
      },
      {
        "nome": "CSA",
        "treinamentos": []
      }
    ]
}


Eu recebo um TreinamentoDTO certinho, com os respectivos departamentos encapsulados na propriedade de lista de departamentoDTO.
Ocorre que, quando realizo o mapeamento para a entidade Treinamento, eu perco essas referências sobre o departamento.
Minha classe/entidade Treinamento NÃO tem uma lista de departamentos, ela tem a já citada lista de TreinamentoDepartamento, que fica vazia quando é realizado esse mapeamento com o automapper.
Minha dúvida é, como devo salvar os departamentos contidos no treinamento?
Meu mappeamento não está funcionando corretamente e eu deveria inserir tudo no banco com um simples context.Treinamento.Add(treinamento) ou devo extrair os departamentos da TreinamentoDTO para uma variável e então salvar usando meu contexto?
Abaixo está o GIST com as classes citadas, se faltou algo, é só me avisar.

https://gist.github.com/christianmlima/02714ccb82fa5375d9f0479c02825c28
Responder

Posts

Seu mapper está tendo um looping, é só isso, eu faria dessa forma:

public class Treinamento
{
    public int Id { get; set; }
    public string Titulo { get; set; }
    public string UrlVideo { get; set; }
    public string UrlArquivo { get; set; }
    public List<TreinamentoDepartamento> TreinamentoDepartamentos { get; set; }
}
    
public class Departamento
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public List<Usuario> Usuarios { get; set; }
    public List<TreinamentoDepartamento> TreinamentoDepartamentos { get; set; }
}
    
public class TreinamentoDepartamento
{
    public int TreinamentoId { get; set; }
    public Treinamento Treinamento { get; set; }
    public int DepartamentoId { get; set; }
    public Departamento Departamento { get; set; }
}
    
public class TreinamentoDTO
{
    public int Id { get; set; }
    public string Titulo { get; set; }
    public string UrlVideo { get; set; }
    public string UrlArquivo { get; set; }
    public List<DepartamentoDTO> Departamentos { get; set; }
}
    
public class DepartamentoDTO
{
    public int DepartamentoId { get; set; }
    public string Nome { get; set; }
}

public class TreinamentoMapp : Profile
{
    public TreinamentoMapp()
    {
        CreateMap<Departamento, DepartamentoDTO>().ReverseMap();
        CreateMap<Treinamento, TreinamentoDTO>().ForMember(destinationMember => destinationMember.TreinamentoDepartamentos, map => map.MapFrom(prop => prop.Departamentos)).ReverseMap();
    }
}


Talvez dessa forma funcione o que está esperando, espero que sim.

Qualquer coisa chama no Skype, vai ser um prazer tentar te ajudar.

Abraço !

live:stellabertthiolly_1
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar