2017-10-02 8 views
0

に私はAutomapper地図インターフェイス別のクラス

public interface IPerson { 
    public string Name { get; set; } 
} 

public class Student : IPerson{ 
    public string Name {get;set;} 
    public string StudentId {get;set;} 
} 

public class Professor : IPerson { 
    public string Name {get;set;} 
    public string ProfessorId {get;set;} 
} 

public class PersonDto { 
    public string Name {get;set;} 
    public string StudentId {get;set;} 
    public string ProfessorId {get;set;} 
} 

を以下していると仮定しかし、私はマップ

class MyMapperProfile : Profile{ 
    CreateMap<Student, PersonDto>() 
     .ForMember(s => s.ProfessorId, s=> s.Ignore()); 
    CreateMap<Student, PersonDto>() 
     .ForMember(s => s.StudentId, s=> s.Ignore()); 

    CreateMap<IPerson, PersonDto>() 
     .Include<Student, PersonDto>() 
     .Include<Professor, PersonDto>(); 
} 

を作成するときに、今私は(マップが動作しないことに気付くことはありません地図)。実際に、マップを検証するとエラーが表示されます(StudentIdがマップされていないなど)

これを修正する方法はありますか?

+0

学生と教授の地図を表示できますか? – CalC

+0

@ Cal279コードを更新しました。 – Husain

+0

これはコピーエラーですか、 'Student'を' PersonDto'に2回定義していますか? – Jasen

答えて

0

以下のマッピング設定が有効です。あなたの例で教授のためのマッピングを作成しなかったことに注意してください(コピー・ペースト・エラーかもしれません)。

 CreateMap<Student, PersonDto>() 
      .ForMember(s => s.StudentId, o => o.MapFrom(x => x.StudentId)) 
      .ForMember(s => s.ProfessorId, o => o.Ignore()); 

     CreateMap<Professor, PersonDto>() 
      .ForMember(s => s.ProfessorId, o => o.MapFrom(x => x.ProfessorId)) 
      .ForMember(s => s.StudentId, o => o.Ignore()); 

     CreateMap<IPerson, PersonDto>() 
      .ForMember(s => s.StudentId, o => o.Ignore()) 
      .ForMember(s => s.ProfessorId, o => o.Ignore()) 
      .Include<Student, PersonDto>() 
      .Include<Professor, PersonDto>(); 

また、フィールドを明示的に設定しています。具体的には、以下のセクションをSpecifying inheritance in derived classesを参照してください。

継承マッピング優先

プロパティをマッピングすることができる複数の方法があるので、これは付加的な複雑さを導入します。

  • は(大会を通じて一致しているプロパティ)
  • コンベンションマッピングプロパティマッピングを無視する明示的なマッピング
  • を継承
  • (.MapFromを()を使用して)

    • 明示的なマッピングを次のようにこれらのソースの優先順位があります

    正直言って、これはあなたが望むものではありません。