Dot-Net

Automapper:使用 ReverseMap() 和 ForMember() 進行雙向映射

  • November 21, 2012

我有一種情況,我想將實體映射到視圖模型並返回。我必須明確指定映射,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>();

要獲得更複雜的東西,恐怕您將不得不手動配置它。

ReverseMap返回一個IMappingExpression表示反轉的映射。呼叫後,後續呼叫將用於配置地圖的反轉。

這是一個例子:

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

這將忽略Pricing相反方向的欄位。

引用自:https://stackoverflow.com/questions/13490456