Inquiridor
ajuda com o automapper???

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- Movido Seilor Bonancio Junior segunda-feira, 29 de agosto de 2011 11:49 (De:ASP.NET)
Todas as Respostas
-
-
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 -
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 formaMapper.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