【问题标题】:Automapper exception自动映射异常
【发布时间】:2012-08-17 12:24:57
【问题描述】:

以下映射代码导致自动映射器在映射完成时抛出异常。

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

这真的很奇怪,src["code"] 有一个值,它是"E",这甚至在 automapper 消息中都有说明。

有没有人知道这个问题是什么或如何解决这个问题?

堆栈跟踪:

[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 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, Action1 opts) +176
AutoMapper.MappingEngine.Map(Object source, Action
1 opts) +162
AutoMapper.MappingEngine.Map(对象源) +143

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    尝试使用ResolveUsing 方法,而不是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());
            }
        }
    }
    

    【讨论】:

    • 请问您可以检查 AutoMapper 配置吗?
    • 基本上没有配置...我们不得不在不使用自动映射器的情况下解决这个问题!
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多