忽略使用Automapper映射一个属性

我正在使用Automapper,我有以下情况:类OrderModel有一个名为“ProductName”,不在数据库中的属性。 所以当我尝试使用以下方法进行映射时:

Mapper.CreateMap<OrderModel, Orders>(); 

它会产生一个exception:

“Project.ViewModels.OrderModel上的以下1个属性未映射:”ProductName“

我已经在AutoMapper的Wiki for Projections中读到了相反的情况(额外的属性是在目标上,而不是在实际上是我的情况下的源)

我如何避免automapper使这个属性的映射?

从Jimmy Bogard: CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());

这是在他的博客的评论之一 。

我可能是一个完美主义者, 我不太喜欢ForMember(…,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 ,但是我不喜欢使用lambdaexpression式的方法。

你可以这样做:

 conf.CreateMap<SourceType, DestinationType>() .ForSourceMember(x => x.SourceProperty, y => y.Ignore()); 

只要有人试图自动执行此操作,就可以使用该扩展方法忽略目标types上的不存在的属性:

 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/

现在有(AutoMapper 2.0)一个IgnoreMap属性,我将使用,而不是stream利的语法,这是一个有点重的恕我直言。

将视图模型映射回域模型时,只需validation源成员列表而不是目标成员列表

 Mapper.CreateMap<OrderModel, Orders>(MemberList.Source); 

现在我的映射validation不会失败,每次向我的域类添加属性时都需要另一个Ignore()

我赞赏由Steve Rukuts添加的扩展,所以我决定添加一个基于他的例子的扩展方法。 希望它会帮助别人:

  public static IMappingExpression<TSource, TDestination> Map<TSource, TDestination>( this IMappingExpression<TSource, TDestination> map, Expression<Func<TSource, object>> src, Expression<Func<TDestination, object>> dst) { map.ForMember(dst, opt => opt.MapFrom(src)); return map; } 

用法:

  Mapper.Initialize(cfg => cfg.CreateMap<UserModel, UserDto>() .Map(src => src.FirstName + " " + src.LastName, dst => dst.UserName)); 

你好所有请使用它的工作正常…自动映射器使用多个.ForMember在C#

  if (promotionCode.Any()) { Mapper.Reset(); Mapper.CreateMap<PromotionCode, PromotionCodeEntity>().ForMember(d => d.serverTime, o => o.MapFrom(s => s.promotionCodeId == null ? "date" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", DateTime.UtcNow.AddHours(7.0)))) .ForMember(d => d.day, p => p.MapFrom(s => s.code != "" ? LeftTime(Convert.ToInt32(s.quantity), Convert.ToString(s.expiryDate), Convert.ToString(DateTime.UtcNow.AddHours(7.0))) : "Day")) .ForMember(d => d.subCategoryname, o => o.MapFrom(s => s.subCategoryId == 0 ? "" : Convert.ToString(subCategory.Where(z => z.subCategoryId.Equals(s.subCategoryId)).FirstOrDefault().subCategoryName))) .ForMember(d => d.optionalCategoryName, o => o.MapFrom(s => s.optCategoryId == 0 ? "" : Convert.ToString(optionalCategory.Where(z => z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName))) .ForMember(d => d.logoImg, o => o.MapFrom(s => s.vendorId == 0 ? "" : Convert.ToString(vendorImg.Where(z => z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg))) .ForMember(d => d.expiryDate, o => o.MapFrom(s => s.expiryDate == null ? "" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", s.expiryDate))); var userPromotionModel = Mapper.Map<List<PromotionCode>, List<PromotionCodeEntity>>(promotionCode); return userPromotionModel; } return null;