我是否正确使用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 -> Update
和Ticket -> 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 Detail
, Update
和Edit
不同子类,则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.