J'utilise Automapper et j'ai le scénario suivant: La classe OrderModel a une propriété appelée 'ProductName' qui ne se trouve pas dans la base de données. Alors quand j'essaye de faire le mapping avec:
Mapper.CreateMap<OrderModel, Orders>();
Il génère une exception:
"Les 1 propriétés suivantes sur Project.ViewModels.OrderModel ne sont pas mappées: 'NomProduit'
J'ai lu sur Wiki d'AutoMapper pour Projections le cas contraire (l'attribut supplémentaire est sur la destination, pas sur la source, ce qui est en fait mon cas)
Comment puis-je éviter automapper pour faire le mappage de cette propriété?
De Jimmy Bogard: CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());
C'est dans l'un des commentaires sur son blog .
Je suis peut-être un peu perfectionniste; Je n'aime pas vraiment la syntaxe ForMember (..., x => x.Ignore ()). C'est une petite chose, mais c'est ce qui compte pour moi. J'ai écrit cette méthode d'extension pour la rendre un peu plus agréable:
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;
}
Il peut être utilisé comme suit:
Mapper.CreateMap<JsonRecord, DatabaseRecord>()
.Ignore(record => record.Field)
.Ignore(record => record.AnotherField)
.Ignore(record => record.Etc);
Vous pouvez également le réécrire pour qu'il fonctionne avec params
, mais je n'aime pas l'aspect d'une méthode avec des charges de lambdas.
Tu peux le faire:
conf.CreateMap<SourceType, DestinationType>()
.ForSourceMember(x => x.SourceProperty, y => y.Ignore());
Pour ceux qui essaient de le faire automatiquement, vous pouvez utiliser cette méthode d'extension pour ignorer les propriétés non existantes sur le type de destination:
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;
}
à utiliser comme suit:
Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();
merci à Can Gencer pour le tuyau :)
source: http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/
Il existe maintenant (AutoMapper 2.0) un attribut IgnoreMap
, que je vais utiliser plutôt que la syntaxe fluide qui est un peu lourde à mon humble avis.
Lorsque vous mappez un modèle de vue sur un modèle de domaine, il peut être beaucoup plus simple de valider simplement la liste des membres source plutôt que la liste des membres de destination.
Mapper.CreateMap<OrderModel, Orders>(MemberList.Source);
Maintenant, ma validation de mappage n'échoue pas, nécessitant une autre Ignore()
, chaque fois que j'ajoute une propriété à ma classe de domaine.