Ignorar el mapeo de una propiedad con Automapper

Estoy usando Automapper y tengo la siguiente situación: Class OrderModel tiene una propiedad llamada ‘ProductName’ que no está en la base de datos. Entonces cuando trato de hacer el mapeo con:

Mapper.CreateMap(); 

Genera una excepción:

“Las siguientes 1 propiedades en Project.ViewModels.OrderModel no están correlacionadas: ‘ProductName’

He leído en AutoMapper’s Wiki for Projections el caso contrario (el atributo adicional está en el destino, no en la fuente que es realmente mi caso)

¿Cómo puedo evitar que Automapper haga el mapeo de esta propiedad?

De Jimmy Bogard: CreateMap().ForMember(x => x.Blarg, opt => opt.Ignore());

Está en uno de los comentarios en su blog .

Soy quizás un poco perfeccionista; Realmente no me gusta la syntax ForMember (…, x => x.Ignore ()). Es una pequeña cosa, pero es importante para mí. Escribí este método de extensión para que sea un poco más agradable:

 public static IMappingExpression Ignore( this IMappingExpression map, Expression> selector) { map.ForMember(selector, config => config.Ignore()); return map; } 

Se puede usar así:

 Mapper.CreateMap() .Ignore(record => record.Field) .Ignore(record => record.AnotherField) .Ignore(record => record.Etc); 

También podría reescribirlo para que funcione con params , pero no me gusta el aspecto de un método con muchas lambdas.

Puedes hacerlo:

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

Ahora hay (AutoMapper 2.0) un atributo IgnoreMap, que voy a utilizar en lugar de la syntax fluida, que es un poco pesado en mi humilde opinión.

Solo para cualquiera que intente hacer esto automáticamente, puede usar ese método de extensión para ignorar las propiedades no existentes en el tipo de destino:

 public static IMappingExpression IgnoreAllNonExisting(this IMappingExpression 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; } 

para ser utilizado de la siguiente manera:

 Mapper.CreateMap().IgnoreAllNonExisting(); 

gracias a Can Gencer por el consejo 🙂

fuente: http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/

Al asignar un modelo de vista a un modelo de dominio, puede ser mucho más simple simplemente validar la lista de miembros fuente en lugar de la lista de miembros de destino.

 Mapper.CreateMap(MemberList.Source); 

Ahora mi validación de mapeo no falla, requiriendo otro Ignore() , cada vez que agrego una propiedad a mi clase de dominio.

Aprecié una extensión agregada por Steve Rukuts, así que decidí agregar un método de extensión más basado en su ejemplo. Espero que ayude a alguien:

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

Uso:

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

Hola a todos, por favor, use esto, está funcionando bien … para auto mapeador use múltiples .ForMember en C #

  if (promotionCode.Any()) { Mapper.Reset(); Mapper.CreateMap().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); return userPromotionModel; } return null;