2017-02-02 16 views
2

ソースの子オブジェクトから親オブジェクトとしてマップすることを試みています。タイプSourceAssignmentの私があることをTを使用しています私の例についてはAutomapper - ソースの子オブジェクトから宛先にマップする方法

public class SourceBaseResponse<T> where T : new() 
{ 
    public string Type { get; set; } 

    public string Id { get; set; } 

    public T Attributes { get; set; } 
} 

public class SourceAssignment 
{ 
    public string Id { get; set; } 

    public string Email { get; set; } 

    public string EmployeeId { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public DateTimeOffset CreatedAt { get; set; } 

} 

先のオブジェクト

public class DestinationAssignment 
{ 
    public string Id { get; set; } 

    public string Email { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

私は直接にソースモデルをマッピングしたい:

ソースモデル先。私は上記の行で、実行時エラーを取得していますように、私は

CreateMap<SourceAssignment, DestinationAssignment>(); 
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>() 
      .ForMember(dest => dest, opt => opt.MapFrom(src => AutoMapperConfig.Mapper.Map<DestinationAssignment>(src.Attributes))); 

を使用しようとしていたこれは、「会員のためのカスタム構成でのみタイプにトップレベルの個々のメンバーのためにサポートされています。」という動作していません

ので、this threadあたりのように私は、私はマッパーが初期化されていません「と言うマッピングが起こるはずのエラーを取得しています、今すぐ下記の

CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>() 
      .AfterMap((src, dst) => Mapper.Map(src.Attributes, dst)); 

を試してみました。適切な構成で初期化を呼び出します。あなたはマッパーを使用しようとしている場合静的なMapper.Mapメソッドへの呼び出しがないことを確認し、ProjectToメソッドまたはUseAsDataSource拡張メソッドを使用している場合は、適切なIConfigurationProviderインスタンスを渡すようにしてください。

各プロパティにForMemberを使用でき、src.Attributesからdestにマップできます(例:src.Attribute.Id to dest.Id)。これはうまくいきますが、私のソースは入れ子の子を含む複雑なクラスです(これはWeb APIレスポンスであり、これを制御することはできません)。ここで多くのカスタムマッピングが行われています

CreateMap<SourceAssignment, DestinationAssignment>(); 

どのように進むかについてのご提案です。

+0

'AfterMap'式が静的' Mapper'を使用していますが、そう作りますそれが設定されていることを確認します(つまり、静的マッパーにはSourceAssignment - > DestinationAssignmentのマップがあります)。現在、スタティックマッパーではなくインスタンスを設定していますか? –

+0

@GeorgPatscheiderスタティックマッパーです。 SourceBaseResponseからのマッピングでなければ、私はこれをAutomapping Source to Destinationに使用することができます。 – sam113

答えて

2

が決議コンテキストがMapper.Map()を呼び出すことができるようにする必要がある、あなたはConstructUsing()を使用して、解像度のコンテキストを取得することができます。

CreateMap<SourceChild, Destination>(); 
CreateMap<Source, Destination>() 
    .ConstructUsing((src, ctx) => ctx.Mapper.Map<Destination>(src.SourceChild)); 
関連する問題