【问题标题】:Automapper - issue when mapping one type to anotherAutomapper - 将一种类型映射到另一种类型时出现问题
【发布时间】:2019-02-28 23:38:24
【问题描述】:

我的项目编译并运行——只是在运行时不会从一种类型映射到另一种类型。所有代码和错误消息如下所示。有人对此有任何想法/意见吗?提前致谢!

我的 startup.cs(配置方法)中有以下代码:-

Mapper.Initialize(config =>
{
    config.CreateMap<VehicleViewModel, Vehicle>().ReverseMap();
});

在我看来,这会在 VehicleViewModel 和 Vehicle 之间创建双向映射。

VehicleViewMOdel 的代码如下:-

public class VehicleViewModel
{
    //Fuel Economy is in L/Km
    public float CityFuelEconomy {get;set;}
    public float HighwayFuelEconomy {get;set;}
    public float ListPrice {get;set;}
    public float SoldPrice{get;set;}
    [Required]
    public int ModelForeignKey {get;set;}
    [Required]
    public int DealerForeignKey{get;set;}
    public string Notes{get; set;}
    public string Color{get; set;}
}

为了完整起见,Vehicle 的代码如下:-

public class Vehicle
{
    [Key]
    public int Id {get; set;}
    //Fuel Economy is in L/Km
    public float CityFuelEconomy {get;set;}
    public float HighwayFuelEconomy {get;set;}
    public float ListPrice {get;set;}
    public float SoldPrice{get;set;}
    [ForeignKey("VehicleModelId")]
    public virtual VehicleModels ModelForeignKey {get;set;}
    [ForeignKey("VehicleDealerId")]
    public virtual Dealer DealerForeignKey{get;set;}
    public string Notes{get; set;}
    public string Color{get; set;}
}

执行映射时,我看到以下消息:-

找到未映射的成员。查看下面的类型和成员。 添加自定义映射表达式、忽略、添加自定义解析器或修改源/目标类型 对于没有匹配的构造函数,添加一个无参数 ctor、添加可选参数或映射所有构造函数参数

编辑 - 根据 Hien Nguyen 的有用建议,我使用 ForMember 来映射不同类型的成员:-

Mapper.Initialize(config =>
        {
            config.CreateMap<VehicleViewModel, Vehicle>()
            .ForMember(dest => dest.DealerForeignKey, opt => opt.MapFrom<DealerResolver>())
            .ForMember(dest => dest.ModelForeignKey, opt => opt.MapFrom<VehicleModelResolver>()).ReverseMap();
        });

这将使用我的解析器从视图模型中获取相关 ID 并检索模型所需的正确对象。以下是在 DealerResolver 中进行业务的代码,例如:-

public Dealer Resolve(VehicleViewModel source, Vehicle destination, Dealer destMember, ResolutionContext context)
    {
        List<Dealer> dealers = _vehicleRepo.GetDealerById(source.DealerForeignKey).ToList();
        return dealers.FirstOrDefault();
    }

我对 VehicleModelResolver 使用了非常相似的想法。

到目前为止一切顺利。

唯一的问题是,当我运行代码并尝试进行映射时,我现在看到一条不同的错误消息:-

AutoMapper.dll 中出现“AutoMapper.AutoMapperMappingException”类型的异常 最里面的异常 System.MissingMethodException : 没有为此对象定义无参数构造函数

您知道是什么原因造成的吗?我真的觉得使用“ForMember”的原始建议是正确的方法,并且认为我们几乎可以解决这个问题。

【问题讨论】:

  • 将 CreateMiisingTypeMaps 设置为 false。也许到那时你就会明白发生了什么。

标签: c# visual-studio-code automapper


【解决方案1】:

您的模型和视图模型具有不同类型的属性。您可以使用 ForMember 来自定义属性之间的映射。

请参阅此自定义映射属性 How to handle custom Properties in AutoMapper

【讨论】:

  • 很好的建议 - 我可以看到这是怎么回事。一旦我解决了一些问题,我会将其标记为答案(进展缓慢,因为我正在自己的空闲时间处理这个问题)
猜你喜欢
  • 2021-04-11
  • 2011-05-30
  • 1970-01-01
  • 2021-04-18
  • 2015-08-12
  • 2017-03-28
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多