Automapper:使用ReverseMap()和ForMember()进行双向映射

ton*_*oni 58 .net bidirectional automapper

我有这种情况,我想将实体映射到viewmodel并返回.我必须使用ForMember()显式指定映射,因为它们的属性不共享完全相同的名称.这是我的类看起来如何的简短示例:

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

public class PartTwoViewModel {
    public int PartInteger { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想用这种方式使用它们:

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);
Run Code Online (Sandbox Code Playgroud)

但它与PartInteger属性不匹配.(整数为0.)

有没有办法让这项工作?(当两个类的属性具有相同的名称时.)我是否必须在方法ForMember()中设置某种选项?

Jon*_*eld 142

ReverseMap返回IMappingExpression表示映射反转的表示.一旦你打电话,后续的电话将用于配置地图的反转.

这是一个例子:

Mapper.CreateMap<CartItemDto, CartItemModel>()
      .ForMember(dest => dest.ExtendedCost, opt => opt.Ignore())
      .ReverseMap()
          .ForMember(dest => dest.Pricing, opt => opt.Ignore())
Run Code Online (Sandbox Code Playgroud)

这将忽略Pricing反方向的字段.

  • 我的加分在这里.以下是示例:https://dotnetfiddle.net/0x8csL (4认同)

Mig*_*uke 49

您可以像这样定义配置:

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));
Run Code Online (Sandbox Code Playgroud)

UPDATE

这里是提交哪里ReverseMap开始实施.从我在代码中看到的,它只创建一个简单的反向映射.例如,在这种情况下,它会自动配置相当于:

Mapper.CreateMap<PartTwoViewModel, PartTwo>();
Run Code Online (Sandbox Code Playgroud)

为了得到更复杂的东西,我担心你将不得不手动配置它.