1

私はこの地図を持っています:

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Sistema.DataEntities.Models.Cliente, CadastroModule.Model.Cliente>().ReverseMap();
});

CadastroModule.Model.Cliente (MVVM モデル):

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 オブジェクトに null 値があるのはなぜですか?

4

1 に答える 1

1

Automapper は、オブジェクトを「フラット化しない」ためにあまり構築されていません。あなたのモデル --> ViewModel マッピングは慣例に従って機能します。宛先の「Endereco」プレフィックスは、ネストされたオブジェクトを調べるように AutoMapper に指示します。

これを別の方法で機能させるには、からCadastroModule.Model.Clienteへのマッピングを手動で追加し、そのマッピングをSistema.DataEntities.Models.Endereco逆のマッピングで使用する必要があります。CadastroModule.Model.ClienteSistema.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 はドメイン エンティティにマップバックするようには構築されていません。もちろん、好きなように使用できますが、この種のシナリオがすぐにサポートされない理由を説明できるかもしれません。

于 2014-08-21T21:06:17.427 に答える