Auto Mapper Error - «Для этого объекта не определен конструктор без параметров» - PullRequest
0 голосов
/ 20 марта 2019

В конечном счете, я пытаюсь сопоставить из VehicleViewMOdel -> Vehicle.Источник указан ниже.Следует отметить тот факт, что два свойства из каждого класса относятся к разным типам.

код, который выполняет код сопоставления

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

для отображаемых классов открытый класс VehicleViewModel {public 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;}
}

Для обработки сопоставления свойств с различными типами типов я использовал следующий 'formember' в моей конфигурации автоматического обработчика (startup.cs)

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) просто берет свойство источника (в данном случае целое число типа) и возвращает объект правильного типа для 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

...