2012-11-21 17 views
42

エンティティをビューモデルにマップして戻したい場合があります。それらのプロパティが正確に同じ名前を共有しないため、ForMember()で明示的にマッピングを指定する必要があります。Automapper:ReverseMap()とForMember()を使用した双方向マッピング

Mapper.CreateMap<PartTwo, PartTwoViewModel>() 
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer)) 
    .ReverseMap(); 

var partTwoViewModel = new PartTwoViewModel() { PartInteger = 42 }; 
var partTwo = Mapper.Map<PartTwoViewModel, PartTwo>(partTwoViewModel); 
Assert.AreEqual(partTwoViewModel.PartInteger, partTwo.Integer); 

しかし、それは整数にプロパティPartIntegerと一致していません:

public class PartTwo { 
    public int Integer { get; set; } 
} 

public class PartTwoViewModel { 
    public int PartInteger { get; set; } 
} 

そして、私は彼らにこの方法を使用する:ここでは私のクラスがどのように見えるかの簡単な例です。 (整数は0です)

これを行う方法はありますか? (両方のクラスのプロパティが同じ名前を持つ場合、それは動作します)メソッドForMember()で何らかのオプションを設定する必要がありますか?

答えて

42

あなたはこのようなあなたの設定を定義することができます。

Mapper.CreateMap<PartTwo, PartTwoViewModel>() 
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer)); 

Mapper.CreateMap<PartTwoViewModel, PartTwo>() 
    .ForMember(dst => dst.Integer, opt => opt.MapFrom(src => src.PartInteger)); 

UPDATE

はここReverseMapが最初に実施されたthe commitです。私がコードで見ることのできるところからは、単純な逆マッピングしか作成しません。たとえば、この場合には、それは自動的に同等の設定になります。より複雑な何かを得るために

Mapper.CreateMap<PartTwoViewModel, PartTwo>(); 

を、私はあなたがそれを手動で設定する必要があるとしていることを恐れています。

+0

はい、これは機能します。私はForMember()を介してマップする多くのプロパティを持っているので、逆マッピングを定義する必要はないと考えました。 – toni

+0

ここに例があります:https://dotnetfiddle.net/0x8csL – Sergey

118

は、マッピングの逆転を表すIMappingExpressionを返します。一旦電話すると、それ以降のコールはマップの逆転を設定するために使用されます。

はここに例を示します

Mapper.CreateMap<CartItemDto, CartItemModel>() 
     .ForMember(dest => dest.ExtendedCost, opt => opt.Ignore()) 
     .ReverseMap() 
      .ForMember(dest => dest.Pricing, opt => opt.Ignore()) 

これは逆方向にPricingフィールドを無視します。

+0

優秀です。メンバーマッピングを再度作成する必要があるのはまだ不便ですが、これはまったく新しいマップを作成するよりも優れています。 – Cody

+1

私のプラスはここに行きます。ここに例があります:https://dotnetfiddle.net/0x8csL – Sergey

+0

@jon Wingfield私はあなたの答えに感謝しますが、私は少し混乱しています。私がReverseMapを呼び出した後に、まだ.ForMemberの呼び出しをすべてやり直さなければならない場合は、何かを得ることができますか?それはちょうどそれですか.ignoreは壊れていますか? – JMarsch

関連する問題