2016-12-20 8 views
3

私は今までのところ驚くべきAutoMapperツールを初めて使用しています。モデルと対応するViewModelオブジェクト内のコレクションをマッピングするのが難しいです。オブジェクト内のオートマップコレクション

モデル:

public class VoteQuestion 
{   
    public virtual ICollection<VoteAnswerOption> VoteAnswerOptions { get; set; } 
} 

対応のViewModel:

public class CreateVoteQuestionViewModel 
{   
    public List<VoteAnswerOptionViewModel> PossibleAnswers { get; set; } 
} 

別のモデル:

public class VoteAnswerOption 
{ 
    public string Answer { get; set; } 
} 

と、対応するビュー

は簡単にするために、私は、コードをトリミングしていますモデル:

public class VoteAnswerOptionViewModel 
{ 
    public string Answer { get; set; } 
} 

「Startup.cs」のマイ・マッパーの設定。いくつかのオプションを試してみましたが、それはマッピングのコレクションを除いて他のすべてのものに役立ちました。

 Mapper.Initialize(config => 
     {   
      config.CreateMap<VoteAnswerOption, VoteAnswerOptionViewModel>().ReverseMap(); 

      config.CreateMap<List<VoteAnswerOptionViewModel>, ICollection<VoteAnswerOption>>().ReverseMap(); 

      config.CreateMap<VoteQuestion, CreateVoteQuestionViewModel>() 
      .ForMember(dest => dest.PossibleAnswers, opts => opts.MapFrom(src => src.VoteAnswerOptions)) 
      .ForMember(dest=>dest.PossibleAnswers,opts=>opts.MapFrom(src=>Mapper.Map<ICollection<VoteAnswerOption>, List<VoteAnswerOptionViewModel>>(src.VoteAnswerOptions))) 
      .ReverseMap(); 
     }); 

そして最後に、私のコントローラのアクション内のマッピング:

var newQuestion = Mapper.Map<CreateVoteQuestionViewModel, VoteQuestion>(voteQuestion); 

は、私が何をしないのですか?

+0

私はそう思っていたので、両方のバージョンを試しましたが、いずれも私のために働いていませんでした。 – lucas

答えて

2

このテストでは、ReverseMap()は、マッピングがシンプルで、ForMember呼び出しを含まない場合にのみ使用できることに注意してください。

public class VoteQuestion { 
    public virtual ICollection<VoteAnswerOption> VoteAnswerOptions { get; set; } 
} 


public class CreateVoteQuestionViewModel { 
    public List<VoteAnswerOptionViewModel> PossibleAnswers { get; set; } 
} 


public class VoteAnswerOption { 
    public string Answer { get; set; } 
} 


public class VoteAnswerOptionViewModel { 
    public string Answer { get; set; } 
} 


[TestFixture] 
public class SOTests { 
    [Test] 
    public void Test_41247396() { 
     Mapper.Initialize(config => { 
      config.CreateMap<VoteAnswerOption, VoteAnswerOptionViewModel>().ReverseMap(); 

      config.CreateMap<VoteQuestion, CreateVoteQuestionViewModel>() 
       .ForMember(dest => dest.PossibleAnswers, 
          opts => opts.MapFrom(src => src.VoteAnswerOptions)); 

      config.CreateMap<CreateVoteQuestionViewModel, VoteQuestion>() 
       .ForMember(dest => dest.VoteAnswerOptions, 
          opts => opts.MapFrom(src => src.PossibleAnswers)); 

     }); 

     var voteQuestion = new VoteQuestion { 
      VoteAnswerOptions = new List<VoteAnswerOption> { 
       new VoteAnswerOption { Answer = "Correct" } 
      } 
     }; 

     var newQuestion = Mapper.Map<VoteQuestion, CreateVoteQuestionViewModel>(voteQuestion); 
     newQuestion.PossibleAnswers.Count.Should().Be(1); 
     newQuestion.PossibleAnswers.Single().Answer.Should().Be("Correct"); 

     var vm = new CreateVoteQuestionViewModel { 
      PossibleAnswers = new List<VoteAnswerOptionViewModel> { 
       new VoteAnswerOptionViewModel {Answer = "Spot on"} 
      } 
     }; 

     var q = Mapper.Map<CreateVoteQuestionViewModel, VoteQuestion>(vm); 
     q.VoteAnswerOptions.Count.Should().Be(1); 
     q.VoteAnswerOptions.Single().Answer.Should().Be("Spot on"); 

    } 
} 
+0

驚くべきことに、このAutoMapperは素晴らしいツールです。優れたソリューションと役立つヒントを提供しました。私は何が間違っていたのか理解し、問題を解決しました。ありがとうございました – lucas

+0

喜んでお手伝いします。 AutoMapperは本当に素晴らしいです。 – stuartd

関連する問題