【问题标题】:AutoMapper ForMember not working when using ignore properties使用忽略属性时 AutoMapper ForMember 不起作用
【发布时间】:2018-10-05 20:58:54
【问题描述】:

我正在使用自动映射器来映射两个对象,但是当我调用时

Mapper.Map<PropertyDto>(CreatePropertyRequestDto, property)

抛出异常说

找到未映射的成员。查看下面的类型和成员。添加一个 自定义映射表达式,忽略,添加自定义解析器,或修改 源/目标类型对于没有匹配的构造函数,添加一个无参数 ctor,添加可选参数,或映射所有构造函数参数 ==================================================== ==================================================== ================================= AutoMapper 为您创建了此类型映射,但您的类型不能 使用当前配置映射。 CreatePropertyRequestDto -> PropertyDto(目标成员列表) PropertyHippo.Properties.Shared.HttpRequestResponse.Dto.CreatePropertyRequestDto -> PropertyHippo.Properties.Shared.Dto.PropertyDto(目标成员列表)

未映射的属性:PropertyId Guid CreateDate UpdateDate LastEditedBy GuidString

下面是我的配置。

    CreateMap<CreatePropertyRequestDto, PropertyDto>()
        .ForMember(dest => dest.PropertyId, opt => opt.Ignore())
        .ForMember(dest => dest.Guid, opt => opt.Ignore())
        .ForMember(dest => dest.CreateDate, opt => opt.Ignore())
        .ForMember(dest => dest.UpdateDate, opt => opt.Ignore())
        .ForMember(dest => dest.LastEditedBy, opt => opt.Ignore())
        .ForMember(dest => dest.GuidString, opt => opt.Ignore());

我已经搜索了答案并找到了thisthisin the docs,但我仍然看不出我做错了什么。

我错过了什么?

编辑

添加了断点,可以看到该代码块正在被命中。作为测试,我还删除了有问题的属性,并且可以看到映射按预期工作

【问题讨论】:

  • 请编辑您的问题以包含完整的MCVE,其他人可以编译和测试。

标签: c# automapper


【解决方案1】:

@Progman 感谢您提出创建 MCVE 的建议。在创建 MCVE 时,我在初始化映射器时遇到了问题,发现 this answer

我的问题是我使用的是静态方法 Mapper.Map,我应该注入一种 IMapper(在写这个答案时,我发现我的问题错过了 mapperConfigurations 的设置方式)。

Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new AutoMapperConfig());
            cfg.AddProfile(new SqlAutoMapperConfig());
        });

        services.AddSingleton(config.CreateMapper());

        services.AddMvc();

        _container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

        _container.Register<IMapper>(() => mapperConfig.CreateMapper(_container.GetInstance));
    }

Handler.cs

public class PropertyRequestHandler : IRequestHandler<NewPropertyRequest, string>
    {
        public PropertyRequestHandler(IPropertyManager propertyManager, IMapper mapper)
        {
            Ensure.That(mapper).IsNotNull();

            _mapper = mapper;
        }

        private IMapper _mapper { get; }

        public string Handle(NewPropertyRequest message)
        {
            var newProperty = _mapper.Map<PropertyDto>(message.NewProperty);
            ...other stuff...
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多