У меня есть эта карта:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Sistema.DataEntities.Models.Cliente, CadastroModule.Model.Cliente>().ReverseMap();
});
CadastroModule.Model.Cliente(MVVM MODEL):
public class Cliente
{
public int ClienteID { get; set; }
public string Nome { get; set; }
public string EnderecoCEP { get; set;}
public string EnderecoBairro { get; set; }
public string EnderecoLogradouro { get; set; }
public int EnderecoNumero { get; set; }
public string EnderecoComplemento { get; set; }
}
Sistema.DataEntities.Models(POCO):
public class Cliente : Entity
{
public Cliente()
{
Endereco = new Endereco();
}
public int ClienteID { get; set; }
public string Nome { get; set; }
public Endereco Endereco { get; set; }//1 pra 1 (Complex type EF)
}
Sistema.DataEntities.Models(POCO):
public class Endereco : Entity
{
public string CEP { get; set; }
public string Bairro { get; set; }
public string Logradouro { get; set; }
public int Numero { get; set; }
public string Complemento { get; set; }
}
Когда я пробую эту работу,
var t = _clienteService.ClienteService_GetAll().Project().To<Cliente>();
Но когда мне нужно вернуться к poco, я получаю проблемы:
Sistema.DataEntities.Models.Cliente clifinal = Mapper.Map<Cliente, Sistema.DataEntities.Models.Cliente>(ObCliente);
Мой результат:
Почему объект Endereco имеет нулевые значения?
Automapper не построен так много для "unflattening" объектов. Ваша модель → отображение ViewModel работает по соглашению; префикс "Endereco" в месте назначения указывает AutoMapper на просмотр вложенного объекта.
Для того, чтобы получить эту работу по - другому, вы должны добавить отображение вручную из CadastroModule.Model.Cliente
в Sistema.DataEntities.Models.Endereco
, а затем использовать это отображение в обратном отображении из CadastroModule.Model.Cliente
в Sistema.DataEntities.Models.Cliente
:
cfg.CreateMap<Cliente, CadastroModule.Model.Cliente>()
.ReverseMap()
// Map the 'Endereco' property from 'Cliente'
.ForMember(dest => dest.Endereco, opt => opt.MapFrom(src => src));
cfg.CreateMap<CadastroModule.Model.Cliente, Endereco>();
.ForMember(dest => dest.Bairro, opt => opt.MapFrom(src => src.EnderecoBairro))
.ForMember(dest => dest.CEP, opt => opt.MapFrom(src => src.EnderecoCEP))
.ForMember(dest => dest.Complemento, opt => opt.MapFrom(src => src.EnderecoComplemento))
.ForMember(dest => dest.Logradouro, opt => opt.MapFrom(src => src.EnderecoLogradouro))
.ForMember(dest => dest.Numero, opt => opt.MapFrom(src => src.EnderecoNumero));
Вместо того, чтобы отображать каждое свойство Endereco
, вы можете вместо этого зарегистрировать Endereco
в качестве исходного префикса:
cfg.CreateMap<Cliente, CadastroModule.Model.Cliente>()
.ReverseMap()
.ForMember(dest => dest.Endereco, opt => opt.MapFrom(src => src));
cfg.RecognizePrefixes("Endereco");
cfg.CreateMap<CadastroModule.Model.Cliente, Endereco>();
Это решение было представлено, я думаю, что сообщение автора по двустороннему картированию стоит прочитать. По сути, AutoMapper не был построен для отображения на сущности домена. Конечно, вы можете использовать его, как хотите, но это может объяснить, почему такой сценарий не поддерживается из коробки.
Mapper.CreateMap
для рассматриваемых классов?