none
Problemas com AutoMapper Asp.NET MVC RRS feed

  • Pergunta

  • Pessoa,


    Estou estudando Asp.NET MVC com EntityFramework e AutoMapper, esbarrei em uma dificuldade aqui.

    Seguinte, tenho uma classe Aluno e Professor, onde faço o CRUD certinho sem problemas, ai chega o problema, tenho uma classe Afericao onde tem as chaves de Aluno e Professor.

    public class Aluno
    {
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public DateTime DataNascimento { get; set; }
    
        public virtual IList<Afericao> RelacaoAfericoes { get; set; }
    }
    
    public class AlunoViewModel
    {
        [Key]
        public int Codigo { get; set; }
    
        [DisplayName("Nome")]
        public string Nome { get; set; }
    
        [DisplayName("Data de Nascimento")]
        public DateTime DataNascimento { get; set; }
    
        public virtual IList<AfericaoViewModel> RelacaoAfericoes { get; set; }
    }
    
    public class AlunoConfiguration : EntityTypeConfiguration<Aluno>
    {
        public AlunoConfiguration()
        {
            ToTable("Alunos");
    
            HasKey(p => p.Codigo);
    
            Property(p => p.Codigo)
                .HasColumnName("AlunoId");
    
            Property(p => p.Nome)
                .HasColumnName("Nome")
                .IsRequired();
    
            Property(p => p.DataNascimento)
                .HasColumnName("DataNascimento")
                .IsRequired();
        }
    }
    
    public class Professor
    {
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public DateTime DataNascimento { get; set; }
    }
    
    public class ProfessorViewModel
    {
        [Key]
        public int Codigo { get; set; }
    
        [DisplayName("Nome")]
        public string Nome { get; set; }
    
        [DisplayName("Data de Nascimento")]
        public DateTime DataNascimento { get; set; }
    }
    
    public class ProfessorConfiguration : EntityTypeConfiguration<Professor>
    {
        public ProfessorConfiguration()
        {
            ToTable("Professores");
    
            HasKey(p => p.Codigo);
    
            Property(p => p.Codigo)
                .HasColumnName("ProfessorId");
    
            Property(p => p.Nome)
                .HasColumnName("Nome")
                .IsRequired();
    
            Property(p => p.DataNascimento)
                .HasColumnName("DataNascimento")
                .IsRequired();
        }
    }
    
    public class Afericao
    {
        public int Codigo { get; set; }
        public int ProfessorId { get; set; }
        public virtual Professor Professor { get; set; }
        public int AlunoId { get; set; }
        public virtual Aluno Aluno { get; set; }
        public float Peso { get; set; }
        public float Altura { get; set; }
    }
    
    public class AfericaoViewModel
    {
        [Key]
        public int Codigo { get; set; }
    
        [ScaffoldColumn(false)]
        public int ProfessorId { get; set; }
    
        public virtual ProfessorViewModel Professor { get; set; }
    
        [ScaffoldColumn(false)]
        public int AlunoId { get; set; }
    
        public virtual AlunoViewModel Aluno { get; set; }
    
        [Display(Name = "Peso")]
        public float Peso { get; set; }
    
        [Display(Name = "Altura")]
        public float Altura { get; set; }
    }
    
    public class AfericaoConfiguration : EntityTypeConfiguration<Afericao>
    {
        public AfericaoConfiguration()
        {
            ToTable("Afericoes");
    
            HasKey(af => af.Codigo);
    
            Property(af => af.Codigo)
                .HasColumnName("AfericaoId");
    
            Property(af => af.ProfessorId)
                .HasColumnName("ProfessorId");
    
            HasRequired(af => af.Professor)
                .WithMany()
                .HasForeignKey(af => af.ProfessorId);
    
            Property(af => af.AlunoId)
                .HasColumnName("AlunoId");
    
            HasRequired(af => af.Aluno)
                .WithMany(a => a.RelacaoAfericoes)
                .HasForeignKey(af => af.AlunoId);
    
            Property(af => af.Peso)
                .HasColumnName("Peso");
    
            Property(af => af.Altura)
                .HasColumnName("Altura");
        }
    }
    
    public class EFContexto : DbContext
    {
        public EFContexto()
            : base("con")
        {
    
        }
    
        public DbSet<Professor> Professores { get; set; }
        public DbSet<Aluno> Alunos { get; set; }
        public DbSet<Afericao> Afericoes { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    
            Configuration.LazyLoadingEnabled = false;
            Configuration.ProxyCreationEnabled = false;
    
            modelBuilder.Configurations.Add(new ProfessorConfiguration());
            modelBuilder.Configurations.Add(new AlunoConfiguration());
            modelBuilder.Configurations.Add(new AfericaoConfiguration());
        }
    
    }

    Quando faço isso aqui:

            public ActionResult Index()
            {
                var aluno = _alunoAppService.GetAll();
    
                var alunoViewModel = Mapper.Map<IEnumerable<Aluno>, IEnumerable<AlunoViewModel>>(_alunoAppService.GetAll());
                return View(alunoViewModel);
            }
    

    Dá certo.

    Agora quando faço isso:

     public Aluno GetAlunosComAfericoes(int pAlunoId)
     {
         return Contexto.Alunos.Include("RelacaoAfericoes")
                               .Where(x => x.Codigo == pAlunoId).FirstOrDefault();
     }
    
    
    public ActionResult Index_Afericao(int alunoId)
    {
        var alunoViewModel = Mapper.Map<Aluno, AlunoViewModel>(_alunoAppService.GetAlunosComAfericoes(alunoId));
    
        return View(alunoViewModel.RelacaoAfericoes);
    }
    

    Gera um erro.

    O AutoMapper não consegue converter de Aluno para AlunoViewModel pois quando faço as consultas tenho os seguintes  resultador:

    _alunoAppService.GetAll()

    GetAlunosComAfericoes(alunoId)


    Alguém sabe me dizer o porque?


    sexta-feira, 30 de setembro de 2016 18:37

Respostas

Todas as Respostas

  • Tente especificando o mapeamento também para os tipos das propriedades contendo a relação de aferições.

    Exemplo em http://stackoverflow.com/questions/35573006/how-to-use-automapper-to-map-destionation-object-with-a-child-object-in-the-sour


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por um acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 4 de outubro de 2016 15:40
  • Juliano boa noite,

    não deu certo!!!

    se eu te passasse o código vc poderia dar uma olhada?

    quarta-feira, 9 de novembro de 2016 22:12
  • Bom dia,

    Compartilhe via Dropbox ou outro serviço que dou uma olhada.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 10 de novembro de 2016 10:38
  • Obrigado Juliano,

    O mapeamento estava errado, refiz e funcionou.

    sexta-feira, 18 de novembro de 2016 21:53
  • Quem bom que conseguiu, Marcelo.

    Na correria acabei me esquecendo de verificar novamente a thread.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 18 de novembro de 2016 22:10