【问题标题】:Automapper: bidirectional mapping with ReverseMap() and ForMember()Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射
【发布时间】:2012-11-09 12:55:33
【问题描述】:

我想将实体映射到视图模型并返回。我必须使用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,效果很好。这个问题已经过时了。

标签: .net automapper bidirectional


【解决方案1】:

你可以这样定义你的配置:

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

更新

这里是the commit,最初实现ReverseMap。从我在代码中可以看到,它只创建了一个简单的反向映射。例如,在这种情况下,它会自动配置等价于:

Mapper.CreateMap<PartTwoViewModel, PartTwo>();

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

【讨论】:

  • 是的,这行得通。我希望我不必定义反向映射,因为我有许多通过 ForMember() 映射的属性。
【解决方案2】:

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

这是一个例子:

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

这将忽略反向的Pricing 字段。

【讨论】:

  • 优秀。虽然必须再次创建成员映射仍然很不方便,但这比必须创建一个全新的映射要好。
  • @jon Wingfield 感谢您的回答,但我也有点困惑。如果我在调用 ReverseMap 之后仍然需要重新执行所有可能的 .ForMember 调用,它对我有什么好处吗?仅仅是 .ignore 被破坏了吗?
  • @JMarsch 已经有一段时间了,但我认为您不需要重做 所有 ForMember 调用,只要是尚未映射的任何内容即可。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多