2011-12-07 12 views
1

Automapperの[Ignore]オプションで問題が発生しました。Automapperは、2番目のレベルのネストされたプロパティを無視しません。

using AutoMapper; 
    using NUnit.Framework; 

    [TestFixture] 
    public class Sample 
    { 
     public class OuterSource 
     { 
      public InnerSource Inner { get; set; } 
     } 

     public class InnerSource 
     { 
      public InnerInnerSource InnerInner { get; set; } 
     } 

     public class InnerInnerSource 
     { 
      public int Value { get; set; } 
     } 

     public class OuterDest 
     { 
      public InnerDest Inner { get; set; } 
     } 

     public class InnerDest 
     { 
      public InnerInnerDest InnerInner { get; set; } 
     } 

     public class InnerInnerDest 
     { 
      public int Value { get; set; } 
     } 

     [Test] 
     public void MergeMap_WhenIgnoringLevel2InnerProperty_PropertyRemainsUnchanged() 
     { 
      Mapper.CreateMap<OuterSource, OuterDest>(); 
       //.ForMember(d => d.Inner, opts => opts.Ignore()); // test passes when added back in 
      Mapper.CreateMap<InnerSource, InnerDest>() 
       .ForMember(d => d.InnerInner, opts => opts.Ignore()); 

      var source = new OuterSource { Inner = new InnerSource { InnerInner = new InnerInnerSource { Value = 25 } } }; 

      var destination = new OuterDest { Inner = new InnerDest { InnerInner = new InnerInnerDest { Value = 99 } } }; 

      Mapper.Map(source, destination); 

      Assert.That(99 == destination.Inner.InnerInner.Value); // FAIL - destination.Inner.InnerInner is null 
     } 
    } 

「無視する」オプションが完全に機能していないように見えることがあります。私が第1の「無視する」でコメントした場合、すべてが期待通りに機能します。問題は、Innerクラスにマップする必要がある他の多くのプロパティがあることです。無視する唯一のものはInnerInnerクラスです。

アイデア?同じ問題は、hereと概説されていましたが、受け入れられた答えは私のためには機能しません。

答えて

2

AutoMapperを使用する際に推奨される方法は、参照されている投稿と同じようにタイプをマップすることです。したがって、宛先オブジェクトを作成することは決してありません。マッピングするタイプを指定するだけです。

var dest = Mapper.Map<OuterSource, OuterDest>(source); 

この方法で使用し、後でdest.InnerInnerの値を設定することはできますか?

+0

これは、文字通り5分前のことですが、これはほぼ完了したことです。 Automapperを使用して、既存のオブジェクトにマップすることができます。私は 'Inner'プロパティ全体を無視する必要がありました。次に、OuterSourceマッピングにAfterMapを追加して、必要なプロパティを取得します。 –

0
Mapper.CreateMap<InnerSource, InnerDest>() 
    .ForMember(d => d.InnerInner, opts => opts.UseDestinationValue()); 

Mapper.CreateMap<OuterSource, OuterDest>() 
    .ForMember(d => d.Inner, opts => opts.UseDestinationValue()) 
    .AfterMap((source, destination) => Mapper.Map(source.Inner, destination.Inner)); 
+0

これは私が行うことです。私はそれがほぼ@コドモンキーだと思ったが、例示した。 – regisbsb