有没有办法做到这一点?我们有一个SummaryDto,它从三种不同的类型映射而来,当我们为每种类型创建地图时,未映射的属性会抛出错误。摘要DTO上大约有35个属性。在每个属性上使用Ignore()选项太麻烦了。有全局忽略的方法吗?类似于
CreateMap<Source,Target>()
.IgnoreAllUnmapped();
有没有办法做到这一点?我们有一个SummaryDto,它从三种不同的类型映射而来,当我们为每种类型创建地图时,未映射的属性会抛出错误。摘要DTO上大约有35个属性。在每个属性上使用Ignore()选项太麻烦了。有全局忽略的方法吗?类似于
CreateMap<Source,Target>()
.IgnoreAllUnmapped();
这对我有效:
public static class MappingExpressionExtensions
{
public static IMappingExpression<TSource, TDest> IgnoreAllUnmapped<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
{
expression.ForAllMembers(opt => opt.Ignore());
return expression;
}
}
由于ForAllMembers
返回void
,如果没有此扩展方法调用ForAllMembers(o => o.Ignore())
将无法起作用。我们希望保持映射表达式可用以启用后续的映射:
CreateMap<Source, Destination>()
.IgnoreAllUnmapped()
.ForMember(d => d.Text, o => o.MapFrom(s => s.Name))
.ForMember(d => d.Value, o => o.MapFrom(s => s.Id));
ForAllOtherMembers(opt => opt.Ignore());
结尾,并且不要使用ForAllMembers
。 - jsgoupil我也曾经遇到过类似的问题,或者说是相似的难题。我的一个类有很多属性(大约30个),但我只想映射其中的4个。添加26个忽略语句似乎有些疯狂(特别是当未来更改类时意味着必须更新它们时!)
最终我发现我可以告诉AutoMapper忽略一切,然后明确地添加我需要的属性。
// Create a map, store a reference to it in a local variable
var map = CreateMap<Source,Target>();
// Ignore all members
map.ForAllMembers(opt => opt.Ignore());
// Add mapping for P1
map.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));
// Add other mappings...
map.ForMember(dest => dest.P2, opt => opt.MapFrom( src => src.P2));
map.ForMember(dest => dest.P3, opt => opt.MapFrom( src => src.P3));
map.ForMember(dest => dest.P4, opt => opt.MapFrom( src => src.P4));
如果你认为可以这样做(但不要这样做,因为它无法编译)那么你会被原谅:
// This won't compile
CreateMap<Source,Target>()
.ForAllMembers(opt => opt.Ignore())
.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));
map
。如果您创建多个映射,则AutoMapper会更新现有映射(是的,可能不太直观,但这就是它的工作方式)。因此,在您的示例中,您可以调用CreateMap...Ignore()
,然后CreateMap...ForMember()...ForMember()...
而不会出现任何问题。我不确定为什么Jimmy决定不从ForAllMembers
返回映射表达式,因为这将允许正常链接。 - julealgonForAllMembers方法的流畅语法扩展方法:
public static IMappingExpression<TSource, TDestination> IgnoreAllMembers<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression
)
{
expression.ForAllMembers(opt => opt.Ignore());
return expression;
}
用法:
在调用 ForMember 之前必须先调用 IgnoreAllMembers。
CreateMap<LocationRevision, Dto.LocationAddressMap>()
.IgnoreAllMembers()
.ForMember(m => m.LocationId, opt => opt.MapFrom(src => src.Id))
;
ForAllMembers
会覆盖所有先前的映射。 - thepirat000.ConvertUsing()
,例如:CreateMap<Source,Target>()
.ConvertUsing(converter=> new Target(){
P1 = converter.P1,
....
});
AutoMapper.Mapper.AssertConfigurationIsValid();
,那么您可能会在将来忘记映射某个属性,这可能会导致问题。我建议小心使用。 - CodeMonkeyKing.ForAllOtherMembers(m => m.Ignore())
。查看示例here。 - Shay