2013-06-17 4 views
10

Ich habe eine einfache Update-Funktion:Automapper - Kann es nur vorhandene Eigenschaften in Quell- und Zielobjekten abbilden?

public void Update(Users user) 
{ 
    tblUserData userData = _context.tblUserDatas.Where(u => u.IDUSER == user.IDUSER).FirstOrDefault(); 
    if (userData != null) 
    { 
     Mapper.CreateMap<Users, tblUserData>(); 
     userData = Mapper.Map<Users, tblUserData>(user); 
     _context.SaveChanges() 
    } 
} 

Userdata ist eine EF Einheit, und es ist Entity Key-Eigenschaft wird auf Null gesetzt, weil, wie ich glaube, es existiert im Zielobjekt, aber nicht in dem Quellobjekt, so Es wird über mit seinem Standardwert (für den Entitätsschlüssel, das ist null) überbrückt

Also, meine Frage ist kann Automapper konfiguriert werden, um nur versuchen, die Eigenschaften, die in der Quelle und Zielobjekte existieren zuordnen? Ich möchte, dass Dinge wie der Entitätsschlüssel und die Navigationseigenschaften übersprungen werden.

Antwort

8

Sie können explizit AutoMapper zu Ignore bestimmten Eigenschaften sagen, ob wie dies erforderlich:

Mapper.CreateMap<Users, tblUserData>() 
     .ForMember(dest => dest.Id, opt => opt.Ignore()); 

, die die Id-Spalte in dem Zielobjekt bedeuten wird immer unangetastet bleiben.

können Sie verwenden, um die Condition Option angeben, ob eine Zuordnung angewendet wird, in Abhängigkeit von dem Ergebnis einer logischen Zustand, wie folgt aus:

Mapper.CreateMap<Users, tblUserData>() 
     .ForMember(dest => dest.Id, opt => opt.Condition(src=>src.Id.HasValue)); 

oder

Mapper.CreateMap<Users, tblUserData>() 
     .ForMember(dest => dest.Id, opt => opt.Condition(src=>src.Id != null)); 

je nach Ihren spezifischen Anforderungen.

+2

Richtig, aber ich muss explizit die Liste der Eigenschaften für jede meiner Entitäten zu ignorieren. Was für mich in meinem Fall schön wäre, wäre eine Möglichkeit, das "gierige" Mapping auszuschalten und AutoMapper die Eigenschaften der Quell- und Zielobjekte vergleichen zu lassen und nur die Eigenschaften zu mappen, die in beiden existieren. Ich habe in den Dokumenten keine solche Option gesehen, also dachte ich, ich würde sie hier fragen, aber ich glaube nicht, dass AutoMapper sich so verhält. –

+0

Ich verstehe die Regel, die Sie anwenden möchten: "Wenn meine Quelleigenschaft nicht null ist und meine Zieleigenschaft nicht null ist, ordnen Sie die Quelle dem Ziel zu", aber ich denke nicht, dass es möglich ist, diese Logik global auf alle anzuwenden Eigenschaft in einem Mapping, ohne explizit eine Bedingung für jedes zu erstellen, wie ich oben getan habe. – CSL

+3

Die Regel, die ich anwenden möchte, lautet: "Wenn meine Quelleigenschaft im Ziel vorhanden ist, ordnet die Quelle dem Ziel zu und ignoriert alle anderen Eigenschaften im Ziel", aber ich glaube, Sie haben Recht, ich müsste die Ignorierung erstellen Bedingungen, wie Sie angegeben haben. –

4

Sie können AutoMapper sagen Felder zu ignorieren, die Sie wie folgt kartiert nicht wollen:

userData = Mapper.Map<Users, tblUserData>(user).ForMember(m => m.EntityKey, opt => opt.Ignore()); 
1

Sie dieses Verhalten, indem sie eine kleine Erweiterung Methode, um alle Eigenschaften zu ignorieren außer Kraft setzen können, die auf dem Zieltyp nicht existieren .

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

Dann ist es möglich, die Zuordnung zu tun wie folgt:

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

Es ist auch möglich, dieses Verfahren an Ihre Bedürfnisse anpassen, indem sie spezifisch Eigenschaften ignorieren, die einen geschützten oder privaten Setter haben, für Beispiel.

Verwandte Themen