我是否正确使用Automapper 2.0的Includefunction?

我不是,或者它不工作……我有一个Source类,我想要映射到彼此inheritance的多个视图。

基本类是Detail,子类是Edit或Update,它使用与Detail相同的所有数据,还有一些其他字段来管理自己的列表或其他。

这是我正在使用的地图:

Mapper.CreateMap() .Include() .Include() .ForMember(dest => dest.Priority, opt => opt.MapFrom(src => src.Priority.Code)) .ForMember(dest => dest.TicketID, opt => opt.MapFrom(src => src.ID)) .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusCode)) .ForMember(dest => dest.Category, opt => opt.MapFrom(src => src.ProblemCategoryCode)) .ForMember(dest => dest.crmBusCode, opt => opt.MapFrom(src => src.Company.crmBusCode)) .ForMember(dest => dest.TeamMembers, opt => opt.MapFrom(src => src.Schedules.Where(s => s.CompleteTime == null))); Mapper.CreateMap() .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules.Where(s => s.EmployeeID == Util.CurrentUserID() && s.CompleteTime == null))); Mapper.CreateMap(); 

然后,如果我在Mapper.Map(ticket)中使用MapFrom的任何属性都没有得到评估,那么如果没有设置映射,它们最终会得到它们已经拥有的值。

那么这里有什么问题?

作为替代解决方案,如果您不想两次调用Mapper.Map 。 您可以将Detail的公共映射移动到扩展方法中:

 public static class MappingExtensions { public static IMappingExpression MapDetailProperties( this IMappingExpression mapBase) where TDest : Detail { return mapBase .ForMember(dest => dest.Priority, opt => opt.MapFrom(src => src.Priority.Code)) ///.... .ForMember(dest => dest.TeamMembers, opt => opt.MapFrom(src => src .Schedules.Where(s => s.CompleteTime == null))); } } 

然后在注册Ticket -> UpdateTicket -> Edit mappers时使用该扩展方法:

 Mapper.CreateMap() .MapDetailProperties() .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules .Where(s => s.EmployeeID == Util.CurrentUserID() && s.CompleteTime == null))); Mapper.CreateMap() .MapDetailProperties(); 

然后你可以正常使用Map:

 Ticket ticket = new Ticket(); var edit = Mapper.Map(ticket); var update = Mapper.Map(ticket); 

我是否正确使用Automapper 2.0的Includefunction?

否 – 当您使用.Include ,AutoMapper期望目标类与源类处于类似的层次结构中(这将在此处进一步讨论)。 换句话说,如果您要映射到Ticket to DetailUpdateEdit不同子类,则Include将是合适的。

在您的情况下,这似乎没有帮助。 我建议使用.Map的重载来获取现有对象并修改它。 这样,您只需要为基本类型定义映射:

 Ticket ticket = new Ticket(); Edit edit = new Edit(); Mapper.Map(ticket, edit); // Edit has now been automapped using the base mapping. Mapper.Map(ticket, edit); // The properties unique to Edit have now been mapped.