2017-08-21 5 views
0

私は[並べ替えのために、次のAutomapperマッピングを実行しようとしています:Automapper発現マッピング

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) 

は私がDatabaseObject式にServerObject式をマップする

ServerObject

KeyValuePairExは、Int16値と文字列値を格納するEnumerationのラッパーです。

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は、次のように定義される。

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

私が持っているマッピングは次のとおりです。

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

マッピングはで失敗します。

'式' DEST => dest.TestEnumKVP。値は最上位のメンバーに解決され、子オブジェクトのプロパティには解決されません。代わりに子タイプまたはAfterMapオプションでカスタムリゾルバを使用してください。 '

DatabaseObject.TestEnumIdにマップするには、ServerObject.TestEnumKVP.Valueが必要です。私は式のマッピングが逆になっていることを認識しています。そのため、MapはDatabaseObjectからServerObjectになっています。私はこれに多くの時間を費やしており、マッピングをどのように機能させるかについては犠牲になっています!

NB。私はAutoMapper 6.1.1を使用しています

助けていただければ幸いです!

答えて

0

エラーと解決策がメッセージの中にあります。すべての表現を忘れてしまいます。 ForMemberが壊れています。代わりにForPathを試してみてください。 エクスプレッションマッピングでForPathがサポートされるようになりました。 https://github.com/AutoMapper/AutoMapper/issues/2293を参照してください。

+0

ありがとうございました。私は提案したようにForPathに式を変更しようとしました。別のエラーが発生しました... "InvalidOperationException:SourceMemberはnullにはなりませんソースタイプ:ServerObject、宛先タイプ:DatabaseObject、プロパティ:TestEnumKVP" – sjr

+0

ForPathで動作するように式のマッピングが更新されていないようです。 TestEnumKVPのリゾルバが必要です。それは基本的なマップを動作させるでしょうが、私はそれが表現マッピングに役立つかどうかは分かりません。 –

+0

これは、Expression Mappingでサポートされている構成ではない可能性があると考えます。試行:config.CreateMap ()。ForMember(dest => dest.TestEnumKVP.Value、opt => opt.ResolveUsing(x =>新しいKeyValuePairEx()(Value = x.TestEnumId)));エラーは "トップレベルのメンバーに解決しなければならない、子オブジェクトではない..."です。今では多くの組み合わせを試しました。 – sjr

1

ありがとうLucian、私はgithubのリンクをたどり、Blaiseによって提供されたソリューションが機能しました。下記を参照してください:私はそれが可能だったので、喜んで回避策で、溶液がとてもきれいで、簡潔だったことを探し始めていた

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

もう一度おねがいします!

関連する問題