3

次のマッピング コードでは、マップが完了したときに automapper が例外をスローします。

mapper.CreateMap<SqlDataReader, CodeModel>()
      .ForMember(dest => dest.Code, 
                 options => options.MapFrom(src => src["code"] != null ? 
                                                   src["code"].ToString() :
                                                   string.Empty));

これは本当に奇妙でsrc["code"]、価値があり"E"ます。

この問題について、またはこの問題を解決する方法について洞察を持っている人はいますか?

スタックトレース:

[NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。] AutoMapper.Mappers.TypeMapMapper.Map(ResolutionContext コンテキスト、IMappingEngineRunner マッパー) +116
AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext コンテキスト) +459

[AutoMapperMappingException:

マッピング タイプ: String -> String System.String -> System.String

宛先パス: CodeModel.Code

ソース値: E]
AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext コンテキスト) +537
AutoMapper.Mappers.DataReaderMapper.MapPropertyValue(ResolutionContext コンテキスト、IMappingEngineRunner マッパー、オブジェクト MappedObject、PropertyMap プロパティマップ) +305
AutoMapper.Mappers.DataReaderMapper.MapPropertyValues( ResolutionContext コンテキスト、IMappingEngineRunner マッパー、オブジェクト結果) +210
AutoMapper.Mappers.DataReaderMapper.Map(ResolutionContext コンテキスト、IMappingEngineRunner マッパー) +639
AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext コンテキスト) +477 AutoMapper.MappingEngine.Map(オブジェクト ソース、タイプ sourceType、タイプ destinationType、アクション1 オプション) +1621 opts) +176
AutoMapper.MappingEngine.Map(Object source, Action

AutoMapper.MappingEngine.Map(オブジェクトソース) +143

4

1 に答える 1

0

ResolveUsingmethod の代わりに methodを使用してみてくださいMapFrom。ただし、あなたの場合、これらのメソッドは両方とも期待どおりに機能するはずです。構成に問題がないかどうかを確認してください。

  mapper.CreateMap<SqlDataReader, CodeModel>()
          .ForMember(dest => dest.Code, 
                     options => options.ResolveUsing(src => src["code"] != null ? 
                                                       src["code"].ToString() :
                                                       string.Empty));

SqlReaderMock を使用して作業サンプルを作成しました。SqlReader 実行のコンテキストは良好であると思います。

//Arrange
var configStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers());
configStore.CreateMap<SqlDataReaderMock, Destination>()
    .ForMember(dest => dest.Name, opt => opt.ResolveUsing(src => src["tyto"] != null
                                                                        ? src["tyto"].ToString()
                                                                        : String.Empty));
var _mappingEngine = new MappingEngine(configStore);

//Act
var result = _mappingEngine.Map<Destination>(new SqlDataReaderMock());

//Assert
Assert.AreEqual("otyt", result.Name);


class Destination
{
    public string Name { get; set; }
}


class SqlDataReaderMock
{
    public string this[string value]
    {
        get
        {
            return new string(value
                                    .ToCharArray()
                                    .Reverse()
                                    .ToArray());
        }
    }
}
于 2012-08-22T06:17:13.430 に答える