1. ホーム
  2. .net

Automapper: ReverseMap() と ForMember() による双方向マッピング

2023-12-17 01:51:51

質問

あるエンティティをビューモデルにマッピングし、その逆を行いたい場合があります。この場合、マッピングを明示的に指定する必要があります。 ForMember() で明示的に指定する必要があります。以下は、私のクラスがどのように見えるかの短い例です。

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

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

そして、このように使いたいのです。

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 から Integer . ( Integer0 .)

これを動作させる方法はあるのでしょうか?(両方のクラスのプロパティが同じ名前である場合は動作します。) メソッドに何らかのオプションを設定しなければならないのでしょうか? ForMember() ?

どのように解決するのですか?

このように設定を定義することができます。

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));

アップデイト

以下は コミット ここで ReverseMap が最初に実装されました。コードを見る限りでは、単純な逆マッピングを作成するだけです。たとえば、この場合、それに相当するものを自動的に構成することになります。

Mapper.CreateMap<PartTwoViewModel, PartTwo>();

これ以上複雑なことをするには、手動で設定する必要がありそうですね。