-3

我遵循了官方文档,说明了 Automapper 9.0 从静态 API 的转变,但我仍然无法使其在我的 c# dotnet core App 中工作。我得到以下异常:

“AutoMapperMappingException:我的控制器类中缺少类型映射配置或不支持的映射”。

你能告诉我关于 Automapper 9.0 的配置步骤吗?

这是我执行的步骤:

启动.cs

      var mappingConfig = new MapperConfiguration(mc =>
        {
           mc.AddProfile(new MyMapperProfile());
         });

   IMapper mapper = mappingConfig.CreateMapper();
   services.AddSingleton(mapper);

MyMapperProfile 类

CreateMap<MasterData.Models.SupplierMaterial, SupplierMaterial>().
            ForMember(dto => dto.TechnicalDrawings, conf => conf.MapFrom(ol =>
                       ol.TechnicalDrawings.Select(v => v.Id)));

            CreateMap<MasterData.Models.WarehouseUbication, WarehouseUbication>().
            ForMember(dto => dto.MaterialCode, conf => conf.MapFrom(ol => ol.Material.Code));

            CreateMap<MasterData.Models.TechnicalDrawing, TechnicalDrawing>().
                ForMember(dto => dto.MaterialCode, conf => conf.MapFrom(ol => ol.Materials.Select(v => v.Code)))
               .ForMember(dto => dto.SupplierMaterialCode, conf => conf.MapFrom(ol => ol.SupplierMaterials.Select(v => v.Code)));

            CreateMap<MasterData.Models.MaterialDocument, MaterialDocument>().
                ForMember(dto => dto.Materials, conf => conf.MapFrom(ol => ol.Materials.Select(v => v.Code)));

            CreateMap<MasterData.Models.Material, Material>().
                ForMember(dto => dto.WarehouseUbications, conf => conf.MapFrom(ol => ol.WarehouseUbications.Select(v => v.Code)))
                .ForMember(dto => dto.SupplierMaterials, conf => conf.MapFrom(ol => ol.SupplierMaterials.Select(v => v.Code)))
                .ForMember(dto => dto.TechnicalDrawingID, conf => conf.MapFrom(ol => ol.TechnicalDrawing.Id))
                .ForMember(dto => dto.MaterialDocuments, conf => conf.MapFrom(ol => ol.MaterialDocuments.Select(v => v.Materials)));


            //var mapper = config.CreateMapper();

        }



    }
}

控制器类

public MaterialController(IMasterDataService masterService, IMapper mapper)
        {
            this.masterDataService = masterService;
            _mapper = mapper;
        }



  //[route]
     public List<Material> getAllMaterials()
      {
                List<Material> materialsList = new List<Material>();           

                foreach (MasterData.Models.Material m in masterDataService.GetMaterials())
                {
                    _mapper.Map<IEnumerable<Contracts.Material>>(m);
                }            

                return materialsList;
            }
4

3 回答 3

1

错误在您的控制器代码中。您应该使用内置的集合映射支持直接从一种集合类型映射到另一种,或者单独映射每个元素,自己构建目标集合。目前,您只是丢弃映射的对象并返回一个空列表。

public List<Material> getAllMaterials()
{
   var materialsList = _mapper.Map<List<Contracts.Material>>(masterDataService.GetMaterials())

   return materialsList;
}

或者:

public List<Material> getAllMaterials()
{
  List<Material> materialsList = new List<Material>();           

  foreach (MasterData.Models.Material m in masterDataService.GetMaterials())
  {
     var mapped = _mapper.Map<Contracts.Material>(m);
     materialsList.Add(mapped);
  }            

  return materialsList;
}
于 2020-03-09T10:20:09.757 回答
0

你的控制器代码应该是这样的

 public List<Material> getAllMaterials()
 {
            List<Material> materialsList = _mapper.Map<List<Contracts.Material>>(masterDataService.GetMaterials());

            return materialsList;
  }

否则,您将单个对象映射到列表。你也返回空列表。

于 2020-03-09T10:23:03.447 回答
0
public class MasterDataMapperProfile : Profile
{
    public MyMapperProfile()
    {
        CreateMap<MasterData.Models.SupplierMaterial, SupplierMaterial>().
            ForMember(dto => dto.TechnicalDrawings, conf => conf.MapFrom(ol => 
                       ol.TechnicalDrawings.Select(v => v.Id)));
    }
}

我认为这应该解决它。目前在配置文件中,您正在创建一个新配置,在该配置上注册您的映射,然后该配置被丢弃。

希望这可以帮助

于 2020-03-09T10:07:52.200 回答