2017-08-21 7 views
0

Ich versuche, die folgende AutoMapper Zuordnung für eine OrderBy auszuführen:AutoMapper Ausdruck Mapping

public class ServerObject 
{ 
    public KeyValuePairEx TestEnumKVP { get; set; } 
} 
:

Expression<Func<ServerObject, object>> serverQueryable = x => x.TestEnumKVP.Value; 
Mapper.Map<Expression<Func<ServerObject, object>>, Expression<Func<DatabaseObject, object>>(serverQueryable) 

I

serverobject definiert als die serverobject Ausdruck in einen DatabaseObject Ausdruck zuordnen möchten

KeyValuePairEx ist ein Wrapper für die Enumeration, der den Int16-Wert und den Zeichenfolgenwert speichert:

public enum TestEnum : Int16 { Test1, Test2, Test3 } 

public class KeyValuePairEx 
{ 
    internal KeyValuePairEx(TestEnum key, string value) { } 

    public TestEnum Key { get; set; } 
    public string Value { get; set; } 
} 

DatabaseObject wie folgt definiert:

public class DatabaseObject 
{ 
    public string TestEnumId { get; set; } 
} 

Die Mapping I haben:

AutoMapper.Mapper.Initialize(config => 
{ 
    config.CreateMap<DatabaseObject, ServerObject>().ForMember(dest => dest.TestEnumKVP.Value, opt => opt.MapFrom(src => src.TestEnumId)); 
}); 

Die Zuordnung nicht mit:

'Ausdruck' dest => dest.TestEnumKVP. Value 'muss zu Member der obersten Ebene und nicht zu den Eigenschaften eines untergeordneten Objekts aufgelöst werden. Verwenden Sie stattdessen einen benutzerdefinierten Resolver für den untergeordneten Typ oder die AfterMap-Option.

Ich brauche ServerObject.TestEnumKVP.Value zu DatabaseObject.TestEnumId zuordnen. Mir ist bewusst, dass Expression-Mappings umgekehrt sind - daher kommt die Map von DatabaseObject zu ServerObject. Ich habe viele Stunden damit verbracht und weiß nicht, wie ich das Mapping zur Arbeit bringen kann!

NB. Ich verwende AutoMapper 6.1.1

Jede Hilfe wäre willkommen!

Antwort

0

Der Fehler und die Lösung sind genau dort in der Nachricht. Vergiss den ganzen Ausdruck Zeug. Das ForMember ist defekt. Versuchen Sie stattdessen ForPath. Die Ausdruckszuordnung unterstützt nun ForPath. Siehe https://github.com/AutoMapper/AutoMapper/issues/2293.

+0

Vielen Dank für Ihre Hilfe. Ich habe versucht, den Ausdruck für ForPath zu ändern, wie Sie es vorgeschlagen haben. Unterschiedlicher Fehler jetzt ... "InvalidOperationException: SourceMember kann nicht null sein. Quellentyp: ServerObject, Zieltyp: DatabaseObject, Eigenschaft: TestEnumKVP" – sjr

+0

Ich nehme an, dass die Ausdruckskartierung für ForPath nicht aktualisiert wurde. Sie benötigen einen Resolver für TestEnumKVP. Das wird die grundlegende Karte funktionieren lassen, aber ich bin mir nicht sicher, ob es mit der Ausdruckskartierung helfen wird. –

+0

Dies ist möglicherweise keine unterstützte Konfiguration für Expression Mapping. Versucht: config.CreateMap (). ForMember (dest => dest.TestEnumKVP.Value, opt => opt.ResolveUsing (x => new KeyValuePairEx() {Value = x.TestEnumId})); Der Fehler ist "muss zu einem Mitglied der obersten Ebene und nicht zu einem untergeordneten Objekt aufgelöst werden ..." So viele Kombinationen wurden jetzt versucht - fast Zeit, aufzugeben! – sjr

1

Danke Lucian, ich folgte dem GitHub Link und die von Blaise angebotene Lösung hat funktioniert. Siehe unten:

CreateMap<DatabaseObject, ServerObject>().ForMember(dest => dest.TestEnumKVP, opt => opt.MapFrom(src => src)); 
CreateMap<DatabaseObject, KeyValuePairEx>().ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.TestEnumId)); 

ich so bei Abhilfen zu suchen begann, erfreut es möglich war, und dass die Lösung war so sauber und präzise.

Danke nochmal!