390 Stimmen

Ignorieren Sie das Zuordnen einer Eigenschaft mit Automapper

Ich verwende Automapper und habe das folgende Szenario: Die Klasse OrderModel hat eine Eigenschaft namens "ProductName", die sich nicht in der Datenbank befindet. Wenn ich also versuche, das Mapping mit zu machen:

Mapper.CreateMap<OrderModel, Orders>(); 

Es wird eine Ausnahme erzeugt:

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

Ich habe gelesen bei AutoMapper's Wiki für Projektionen der umgekehrte Fall (das zusätzliche Attribut befindet sich am Zielort, nicht in der Quelle, was eigentlich mein Fall ist)

Wie kann ich vermeiden, dass automapper die Zuordnung dieser Eigenschaft vornimmt?

682voto

smartcaveman Punkte 39448

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

Es ist in einer der Kommentare in seinem Blog .

UPDATE(von Jamie's Kommentar Jan 4 '19 um 11:11:)

Ignorieren wurde ersetzt durch DoNotValidate in ForSourceMember: https://github.com/AutoMapper/AutoMapper/blob/master/docs/8.0-Upgrade-Guide.md

286voto

Steve Rukuts Punkte 8837

Ich bin vielleicht ein bisschen ein Perfektionist; ich mag nicht wirklich die ForMember(..., x => x.Ignore()) Syntax. Es ist eine Kleinigkeit, aber sie ist wichtig für mich. Ich habe diese Erweiterungsmethode geschrieben, um es ein bisschen netter 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;
}

Er kann folgendermaßen verwendet werden:

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

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

100voto

Richard Punkte 1205

Sie können dies tun:

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

In der neuesten Version von Automapper können Sie Automapper auch einfach anweisen, das Feld nicht zu validieren

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

34voto

Guillaume Punkte 1026

Es gibt jetzt (AutoMapper 2.0) eine IgnoreMap Attribut, das ich anstelle der fließenden Syntax verwenden werde, die IMHO etwas schwerfällig ist.

31voto

Stéphane Punkte 11465

Nur für alle, die versuchen, dies automatisch zu tun, 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();

Dank an Can Gencer für den Tipp :)

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X