AutoMapper - субобъект остается нулевым при отображении обратно в DTO из ViewModel

1

У меня есть эта карта:

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);

Мой результат:

Изображение 174551

Почему объект Endereco имеет нулевые значения?

  • 0
    Можете ли вы показать свой вызов Mapper.CreateMap для рассматриваемых классов?
  • 0
    О, неважно, я вижу это там, извините
Показать ещё 1 комментарий
Теги:
mvvm
automapper
automapper-3

1 ответ

1
Лучший ответ

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 не был построен для отображения на сущности домена. Конечно, вы можете использовать его, как хотите, но это может объяснить, почему такой сценарий не поддерживается из коробки.

  • 0
    Если это не очень хорошая вещь для этого сценария ... у вас есть другой инструмент? Я нашел кое-что о ValueInjecter ... это хороший способ? Имейте в виду, что это пропотип ... чем лучше инструмент, тем меньше беспокойства.
  • 0
    Чтобы «защитить» свой домен, вы можете просто установить свойства вручную. Опять же, вы можете использовать AutoMapper для этого, это просто не то, как он был изначально разработан из того, что я понимаю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню