none
ajuda com o automapper??? RRS feed

  • Pergunta

  • Bom dia amigos estou precisando de uma ajudinha com o automapper.
    Ex:
    O meu modelo de dominio esta assim:
    public class Igreja : Entidade<int>
    {
    #region Constrotor(es)

    public Igreja()
    {
    this.Nome = null;
    this.Foto = null;
    this.TipoCongracao = null;
    this.Endereco = null;
    }

    public Igreja(int codigo)
    : this()
    {
    this.Codigo = codigo;
    }

    #endregion

    #region Propriedades
    public string Nome
    {
    get;
    set;
    }

    public string Foto
    {
    get;
    set;
    }

    public TipoCongrecao TipoCongracao
    {
    get;
    set;
    }

    public Endereco Endereco
    {
    get;
    set;
    }

    #endregion
    }

    public class Endereco : Entidade<int>
    {
    #region Atributos
    public string Bairro
    {
    get;
    set;
    }

    public string Cidade
    {
    get;
    set;
    }

    public string Estado
    {
    get;
    set;
    }

    public string Pais
    {
    get;
    set;
    }

    public string Complemento
    {
    get;
    set;
    }

    public string CEP
    {
    get;

    set;
    }

    public string Numero
    {
    get;
    set;
    }
    #endregion
    }

    public class TipoCongrecao : Entidade<int>
    {
    #region Propriedades
    public string Descricao
    {
    get;
    set;
    }
    #endregion
    }

    E minha ViewModel esta flat com todas as propriedades dessa classe:

    public class IgrejaViewModel : ViewModelBase
    {
    #region Propriedades
    public string Nome
    {
    get;
    set;
    }

    public string Foto
    {
    get;
    set;
    }
    #endregion

    #region Atributos
    public string Bairro
    {
    get;
    set;
    }

    public string Cidade
    {
    get;
    set;
    }

    public string Estado
    {
    get;
    set;
    }

    public string Pais
    {
    get;
    set;
    }

    public string Complemento
    {
    get;
    set;
    }

    public string CEP
    {
    get;

    set;
    }

    public string Numero
    {
    get;
    set;
    }
    #endregion
    }

    Eu estou tentando usar o automapper para seta os valores es suas
    respectivas entidade (Igreja,Endereco,TipoCongrecao), mas so estou
    conseguindo setar valores na entidade Igreja, como posso fazer o mesmo
    com as entidade endereco e tipoCongrecao?

    O meu create esta assim
    Igreja igreja = Mapper.Map<IgrejaViewModel, Igreja>(viewModel);


    Artur Araújo
    sábado, 27 de agosto de 2011 14:13

Todas as Respostas

  • veja

    http://bengtbe.com/blog/2009/04/14/using-automapper-to-map-view-models-in-asp-net-mvc/


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
    segunda-feira, 29 de agosto de 2011 11:49
  • Bom dia Seilor, esse exemplo funciona muito bem, quando e entidade para viewmodel, seguindo a analogia do artigo eu os seguintes teste:

     

    public class Customer
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Email { get; set; }
            public Address HomeAddress { get; set; }

            public string GetFullName()
            {
                return string.Format("{0} {1}", FirstName, LastName);
            }
        }

        public class Address
        {
            public string Address1 { get; set; }
            public string Address2 { get; set; }
            public string City { get; set; }
            public string PostalCode { get; set; }
            public string Country { get; set; }
        }

        public class CustomerListViewModel
        {
            public string FullName { get; set; }
            public string Email { get; set; }
            public string HomeAddressCountry { get; set; }
            public string HomeAddressAddress1 { get; set; }
            public string HomeAddressAddress2 { get; set; }
            public string HomeAddressCity { get; set; }
        }

     

            [TestMethod]
            public void ViewModel_To_Entidade_Test()
            {
                CustomerListViewModel customerListViewModel = new CustomerListViewModel()
                                                                  {
                                                                      Email = "Email",
                                                                      FullName = "FullName",
                                                                      HomeAddressAddress1 = "HomeAddressAddress1",
                                                                      HomeAddressAddress2 = "HomeAddressAddress2",
                                                                      HomeAddressCity = "HomeAddressCity",
                                                                      HomeAddressCountry = "HomeAddressCountry"
                                                                  };

                IList<CustomerListViewModel> customerListViewModels = new List<CustomerListViewModel>();
                customerListViewModels.Add(customerListViewModel);

                Mapper.CreateMap<CustomerListViewModel, Customer>();

                IList<Customer> viewModelList = Mapper.Map<IList<CustomerListViewModel>, IList<Customer>>(customerListViewModels);
            }

     

    O endereço da classe customer fica nulo, sabe como posso resolver ?


    Artur Araújo
    segunda-feira, 29 de agosto de 2011 12:35
  • Ola Seilor, consegui fazer o que estava querendo, mas foi na tentativa e erro, estava faltando um outro Mapper.CreateMap<CustomerViewModel, Address>(); para minha entidade Address, quando coloquei funcionou.

    Segue o exemplo:

    using System;
    using System.Collections;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using AutoMapper;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace AutoMapperTest
    {
      public class Customer
      {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public Address HomeAddress { get; set; }
    
        public string GetFullName()
        {
          return string.Format("{0} {1}", FirstName, LastName);
        }
      }
    
      public class Address
      {
        public string Address1 { get; set; }
        public string Address2 { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
      }
    
      public class CustomerViewModel
      {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string Country { get; set; }
        public string Address1 { get; set; }
        public string Address2 { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
      }
    
      [TestClass]
      public class UnitTest1
      {
    
        [TestMethod]
        public void Entidade_To_ViewModel_Test()
        {
          Customer customer = new Customer()
          {
            Email = "Email",
            FirstName = "FirstName",
            HomeAddress = new Address()
            {
              Address1 = "Address1",
              Address2 = "Address2",
              City = "City",
              Country = "Country"
            },
            LastName = "LastName"
          };
    
          //Nesse pondo eu eu consegui resolver dessa forma, deve existir uma maneira mas facil de fazer, mas por enquanto me atente
          Mapper.CreateMap<Customer, CustomerViewModel>()
            .ForMember(x => x.Address1, o => o.MapFrom(s => s.HomeAddress.Address1))
            .ForMember(x => x.Address2, o => o.MapFrom(s => s.HomeAddress.Address2))
            .ForMember(x => x.City, o => o.MapFrom(s => s.HomeAddress.City))
            .ForMember(x => x.Country, o => o.MapFrom(s => s.HomeAddress.Country))
            .ForMember(x => x.PostalCode, o => o.MapFrom(s => s.HomeAddress.PostalCode));
    
          Mapper.AssertConfigurationIsValid();
    
          CustomerViewModel customerViewModel = Mapper.Map<Customer, CustomerViewModel>(customer);
    
          Assert.AreEqual(customerViewModel.FirstName, customer.FirstName);
          Assert.AreEqual(customerViewModel.LastName, customer.LastName);
          Assert.AreEqual(customerViewModel.Email, customer.Email);
          Assert.AreEqual(customerViewModel.Address1, customer.HomeAddress.Address1);
          Assert.AreEqual(customerViewModel.Address2, customer.HomeAddress.Address2);
          Assert.AreEqual(customerViewModel.City, customer.HomeAddress.City);
          Assert.AreEqual(customerViewModel.Country, customer.HomeAddress.Country);
          Assert.AreEqual(customerViewModel.PostalCode, customer.HomeAddress.PostalCode);
        }
    
        [TestMethod]
        public void ViewModel_To_Entidade_Test()
        {
          CustomerViewModel customerViewModel = new CustomerViewModel()
          {
            FirstName = "FirstName",
            LastName = "LastName",
            Email = "Email",
            Address1 = "HomeAddressAddress1",
            Address2 = "HomeAddressAddress2",
            City = "HomeAddressCity",
            Country = "HomeAddressCountry"
          };
    
          Mapper.CreateMap<CustomerViewModel, Customer>()
            .ForMember(dest => dest.HomeAddress, opts => opts.MapFrom(Mapper.Map<CustomerViewModel, Address>));
    
          Mapper.CreateMap<CustomerViewModel, Address>();
    
          Mapper.AssertConfigurationIsValid();
    
          Customer customer = Mapper.Map<CustomerViewModel, Customer>(customerViewModel);
    
          Assert.AreEqual(customerViewModel.FirstName, customer.FirstName);
          Assert.AreEqual(customerViewModel.LastName, customer.LastName);
          Assert.AreEqual(customerViewModel.Email, customer.Email);
          Assert.AreEqual(customerViewModel.Address1, customer.HomeAddress.Address1);
          Assert.AreEqual(customerViewModel.Address2, customer.HomeAddress.Address2);
          Assert.AreEqual(customerViewModel.City, customer.HomeAddress.City);
          Assert.AreEqual(customerViewModel.Country, customer.HomeAddress.Country);
          Assert.AreEqual(customerViewModel.PostalCode, customer.HomeAddress.PostalCode);
        }
    
      }
    }
    

    No Entidade_To_ViewModel_Test a unica forma que consegui setar os valores foi dessa forma

    Mapper.CreateMap<Customer, CustomerViewModel>()
            .ForMember(x => x.Address1, o => o.MapFrom(s => s.HomeAddress.Address1))
            .ForMember(x => x.Address2, o => o.MapFrom(s => s.HomeAddress.Address2))
            .ForMember(x => x.City, o => o.MapFrom(s => s.HomeAddress.City))
            .ForMember(x => x.Country, o => o.MapFrom(s => s.HomeAddress.Country))
            .ForMember(x => x.PostalCode, o => o.MapFrom(s => s.HomeAddress.PostalCode));
    


    Deve existir uma maneira mas facil de fazer isso


    Artur Araújo
    segunda-feira, 29 de agosto de 2011 20:27