web-dev-qa-db-fra.com

Ignorer le mappage d'une propriété avec Automapper

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é?

258
Msam85

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

C'est dans l'un des commentaires sur son blog .

417
smartcaveman

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.

225
Steve Rukuts

Tu peux le faire:

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

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/

28
Stéphane

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.

28
Guillaume

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.

21
Loren Paulsen