【问题标题】:Auto Mapper Error - "No Parameterless constructor defined for this object"自动映射器错误 - “没有为此对象定义无参数构造函数”
【发布时间】:2019-03-20 13:16:43
【问题描述】:

最终,我试图从 VehicleViewMOdel -> Vehicle 映射。来源如下。值得注意的是,每个类的两个属性属于不同类型。

执行映射的代码

var newVehicle = Mapper.Map<Vehicle>(vehicleData_);

被映射的类的代码 公共类 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;}
}



public class Vehicle
{
    public 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;}
}

为了处理映射不同类型类型的属性,我在我的自动映射器配置 (startup.cs) 中使用了以下“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();
        });

提到的解析器(VehicleModelResolver 和 DealerResolver)只需获取源属性(在本例中为 thype 整数)并为 Vehicle.ModelForeignKey 和 Vehicle.DealerForeignKey 返回一个正确类型的对象

private IVehicleRepository _vehicleRepo;
    public DealerResolver(IVehicleRepository vehicleRepo_)
    {
        _vehicleRepo = vehicleRepo_;
    }

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


public class VehicleModelResolver : IValueResolver<VehicleViewModel, Vehicle, VehicleModels>
{
    private IVehicleRepository _vehicleRepo;
    public VehicleModelResolver(IVehicleRepository vehicleRepo_)
    {
        _vehicleRepo = vehicleRepo_;
    }

    public VehicleModels Resolve(VehicleViewModel source, Vehicle destination, VehicleModels destMember, ResolutionContext context)
    {
        List<VehicleModels> vehModels = _vehicleRepo.GetModelById(source.ModelForeignKey).ToList();
        return vehModels.FirstOrDefault();
    }
}

运行代码时,我看到错误消息“没有为此对象定义无参数构造函数。” 在运行时单步执行代码会发现所有属性的映射都很好,直到 VehicleViewModel.MOdelForeignKey。

目前我看不到关于映射 VehicleViewModel.ModelForeignKey -> Vehicle.ModelForeignKey 的一些东西。就像我之前说的,我意识到属性是不同类型的,但是解析器应该注意这一点。有什么想法吗?

更新 - 对此有建议 - DI 配置不正确。制作了一个快速视频,详细说明问题及其解决方案https://youtu.be/tGU7TjDvSK8

【问题讨论】:

  • 您的DI configuration 很可能已损坏。
  • 感谢您的意见。这是我在空闲时间做的一个项目,所以可能需要我一段时间来回复。
  • 老实说 - 在尝试不同的东西至少 3 小时后,我仍然没有这个工作。我能说的最好的是 automapper 确实知道“知道”如何将参数之一构造到 IValueResolver 实例。任何提示或至少一个带有简单解释的代码示例的机会?代码本身在github.com/Ted95153420/CarWebApp(分支是chapter6_API)
  • 这正是文档的作用。我会从它开始,看看它是如何工作的,然后在它的基础上进行构建。甚至还有一个专门用于 .Net Core 的部分。
  • 是的 - 阅读文档确实解决了我的问题。我在截屏视频中更详细地记录了问题和解决方案。 youtu.be/tGU7TjDvSK8

标签: c# .net-core mapping automapper


【解决方案1】:

youtu.be/tGU7TjDvSK8

不是我的答案,我只是制作了一个视频以使其超级清晰。 - 我想把真正的答案归功于 Lucian Bargaoanu。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多