自动映射器:使用ReverseMap()和ForMember()进行双向映射


67

我有一种情况,我想将一个实体映射到一个视图模型并返回。我必须明确指定映射,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);

不过,这并不属性匹配PartIntegerInteger。(Integer0。)

有没有办法使这项工作?(当两个类的属性具有相同的名称时,它就会起作用。)我是否必须在方法中设置某种选项ForMember()


我只是尝试使用ReverseMap您的方式,所以效果很好。这个问题已经过时了。
Boiethios

Answers:


52

您可以这样定义配置:

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

要使事情变得更复杂,恐怕您将不得不手动配置它。


1
是的,这可行。我希望我不必定义逆向映射,因为我有许多通过ForMember()映射的属性。
toni 2012年

154

ReverseMap返回IMappingExpression表示映射反转的。调用后,后续调用将用于配置地图的反转。

这是一个例子:

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

这将忽略Pricing反向的字段。


优秀的。尽管再次创建成员映射仍然很不方便,但这比必须创建一个全新的映射要好。
科迪2014年

@jon Wingfield感谢您的回答,但我也有些困惑。如果在调用ReverseMap之后仍需要重新执行may .ForMember调用,是否可以为我带来任何好处?只是.ignore损坏了吗?
JMarsch '16

1
@JMarsch它已经有一段时间,但我不认为你需要重做所有ForMember呼叫,也就是尚未映射只是什么。
乔恩·温菲尔德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.