我正在使用Automapper,我有以下场景:
类OrderModel有一个名为“ProductName”的属性,该属性不在数据库中。
所以当我尝试用:
Mapper.CreateMap<OrderModel, Orders>();
它会生成一个异常:
" Project.ViewModels.OrderModel上的以下1个属性没有被映射:
我已经在AutoMapper的Wiki上阅读了相反的情况(额外的属性是在目的地,而不是在实际上是我的情况下的源)
我如何避免自动程序使这个属性的映射?
你可以这样做:
conf.CreateMap<SourceType, DestinationType>()
.ForSourceMember(x => x.SourceProperty, y => y.Ignore());
或者,在最新版本的Automapper中,您只需告诉Automapper不验证该字段
conf.CreateMap<SourceType, DestinationType>()
.ForSourceMember(x => x.SourceProperty, y => y.DoNotValidate());
对于任何试图自动执行此操作的人来说,您可以使用扩展方法忽略目标类型上不存在的属性:
public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
var destinationType = typeof(TDestination);
var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
&& x.DestinationType.Equals(destinationType));
foreach (var property in existingMaps.GetUnmappedPropertyNames())
{
expression.ForMember(property, opt => opt.Ignore());
}
return expression;
}
使用方法如下:
Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();
感谢Can Gencer的建议:)
来源:
http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/
我可能是一个完美主义者;我不太喜欢这张…, x => x. ignore())语法。这是件小事,但对我很重要。我写了这个扩展方法,使它更好一点:
public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> map,
Expression<Func<TDestination, object>> selector)
{
map.ForMember(selector, config => config.Ignore());
return map;
}
它可以这样使用:
Mapper.CreateMap<JsonRecord, DatabaseRecord>()
.Ignore(record => record.Field)
.Ignore(record => record.AnotherField)
.Ignore(record => record.Etc);
你也可以重写它来使用params,但是我不喜欢一个带有大量lambda的方法。