wake-up-neo.com

Ignorieren Sie die Zuordnung einer Eigenschaft mit Automapper

Ich verwende Automapper und habe folgendes Szenario: Die Klasse OrderModel hat eine Eigenschaft namens 'ProductName', die nicht in der Datenbank enthalten ist. Wenn ich also versuche, das Mapping mit:

Mapper.CreateMap<OrderModel, Orders>(); 

Es wird eine Ausnahme generiert:

"Die folgenden 1 Eigenschaften in Project.ViewModels.OrderModel sind nicht zugeordnet: 'ProductName'

Ich habe in AutoMappers Wiki für Projektionen den umgekehrten Fall gelesen (das zusätzliche Attribut befindet sich am Ziel, nicht in der Quelle, die eigentlich mein Fall ist)

Wie kann ich verhindern, dass Automapper die Zuordnung dieser Eigenschaft vornimmt?

258
Msam85

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

Es ist in einer der Kommentare in seinem Blog .

417
smartcaveman

Ich bin vielleicht ein bisschen ein Perfektionist; Ich mag die Syntax von ForMember (..., x => x.Ignore ()) nicht wirklich. Es ist eine kleine Sache, aber es ist mir wichtig. Ich habe diese Erweiterungsmethode geschrieben, um es ein bisschen schöner zu machen:

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;
}

Es kann so verwendet werden:

Mapper.CreateMap<JsonRecord, DatabaseRecord>()
        .Ignore(record => record.Field)
        .Ignore(record => record.AnotherField)
        .Ignore(record => record.Etc);

Sie könnten es auch umschreiben, um mit params zu arbeiten, aber ich mag das Aussehen einer Methode mit vielen Lambdas nicht.

225
Steve Rukuts

Du kannst das:

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

Nur für alle, die dies automatisch versuchen, können Sie diese Erweiterungsmethode verwenden, um nicht vorhandene Eigenschaften des Zieltyps zu ignorieren:

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;
}

wie folgt zu verwenden:

Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();

danke an Can Gencer für den Tipp :)

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

28
Stéphane

Es gibt jetzt (AutoMapper 2.0) ein IgnoreMap -Attribut, das ich verwenden werde, anstatt der fließenden Syntax, die meiner Meinung nach ein bisschen schwer ist.

28
Guillaume

Wenn Sie ein Ansichtsmodell wieder einem Domänenmodell zuordnen, kann es viel einfacher sein, die Quellmitgliedsliste und nicht die Zielmitgliedsliste zu überprüfen

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

Jetzt schlägt meine Zuordnungsüberprüfung nicht fehl und erfordert jedes Mal, wenn ich meiner Domänenklasse eine Eigenschaft hinzufüge, eine andere Ignore().

21
Loren Paulsen