2012-11-21 130 views
42

我有这种情况,我想将实体映射到视图模型并返回。我必须使用ForMember()明确指定映射,因为它们的属性不共享完全相同的名称。这里是我的课怎么看起来像一个简单的例子:Automapper:使用ReverseMap()和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为整型。 (整数为0)

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

回答

42

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

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

UPDATE

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

Mapper.CreateMap<PartTwoViewModel, PartTwo>(); 

得到任何东西更复杂,我怕你将不得不手动配置。

+0

是的,这是有效的。我希望我不必定义反向映射,因为我有很多通过ForMember()映射的属性。 – toni

+0

以下是示例:https://dotnetfiddle.net/0x8csL – Sergey

118

ReverseMap返回代表映射反转的IMappingExpression。一旦你打电话,它随后的电话将用于配置地图的逆转。

下面是一个例子:

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

这将忽略在反向方向上的Pricing字段。

+0

优秀。虽然再次创建成员映射仍然不方便,但这比创建全新映射要好。 – Cody

+1

我的加在这里。这里是这个例子:https://dotnetfiddle.net/0x8csL – Sergey

+0

@jon Wingfield我很感谢你的回答,但我也有点困惑。如果我在调用ReverseMap之后仍然需要重新执行所有可能的.ForMember调用,它会使我获得什么吗?这只是一个.ignore坏了吗? – JMarsch